Cập nhật tiện ích theo chương trình từ hoạt động / dịch vụ / người nhận


97

Tôi biết điều đó là có thể, nhưng tôi không thể tìm ra cách để kích hoạt cập nhật tiện ích con của mình từ hoạt động chính. Không có ý định chung nào mà tôi có thể phát sóng?

Câu trả lời:


191

Nếu bạn đang sử dụng AppWidgetProvider, bạn có thể cập nhật nó theo cách này:

Intent intent = new Intent(this, MyAppWidgetProvider.class);
intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
// Use an array and EXTRA_APPWIDGET_IDS instead of AppWidgetManager.EXTRA_APPWIDGET_ID,
// since it seems the onUpdate() is only fired on that:
 int[] ids = AppWidgetManager.getInstance(getApplication())
    .getAppWidgetI‌​ds(new ComponentName(getApplication(), MyAppWidgetProvider.class));
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids);
sendBroadcast(intent);

30
Bạn đặt ở widgetIdđâu?
Kris B

38
@KrisB từ câu trả lời bên dưới, lấy mảng bằng cách thực hiện điều này: int ids [] = AppWidgetManager.getInstance (getApplication ()). GetAppWidgetIds (new ComponentName (getApplication (), WidgetProvider.class));
MobileMon

11
Bạn có thể sử dụng một hằng số, không cần phải hardcode:intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
Mārtiņš Briedis

3
ĐỪNG theo dõi bình luận @gelupa để sử dụng R.xml.mywidget cho widgetID! Nó hoàn toàn sai và chỉ tốn của tôi 4 giờ gỡ lỗi !!! SỬ DỤNG MobileMon giải pháp để có được widgetID đúng
Ilja S.

5
dành cho id: `int widgetIDs [] = AppWidgetManager.getInstance (activity) .getAppWidgetIds (new ComponentName (activity, widget.class));`
abbasalim 22/6/17

75

Điều này hữu ích khi tôi tìm kiếm cách cập nhật tiện ích con từ một dịch vụ / hoặc hành động (nhưng có thể có từ mọi Ngữ cảnh):

Context context = this;
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_2x1);
ComponentName thisWidget = new ComponentName(context, MyWidget.class);
remoteViews.setTextViewText(R.id.my_text_view, "myText" + System.currentTimeMillis());
appWidgetManager.updateAppWidget(thisWidget, remoteViews);

Tôi biết tôi đã nhảy vào đây muộn như 6 tháng. Nhưng tôi đồng ý với Andrew. Tôi đã thử phương pháp gốc trong chủ đề này. Và điều gì đó về cách các ID được lấy khiến nó bắt đầu không thành công. Phương pháp này (cập nhật trực tiếp các trường theo cách thủ công) hoạt động tốt hơn. Đối với mục đích của tôi, ít nhất.
durbnpoisn

Công cụ tuyệt vời. Không biết bạn đã kết thúc như thế nào với điều này nhưng hoạt động tốt và trơn tru cho tất cả các phiên bản Widget của tôi. :)
Atul O Holic

cái này cũng có tác dụng với tôi. Tôi nghĩ rằng chúng tôi sẽ cần thực hiện phát sóng và bật Nhận, nhưng yêu cầu của tôi hoàn toàn phù hợp với điều này
stingray_

30

Vì vậy, để cập nhật tiện ích con từ một hoạt động, bạn có thể làm như sau:

Intent intent = new Intent(this, DppWidget.class);
intent.setAction("android.appwidget.action.APPWIDGET_UPDATE");
int ids[] = AppWidgetManager.getInstance(getApplication()).getAppWidgetIds(new ComponentName(getApplication(), DppWidget.class));
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,ids);
sendBroadcast(intent);

Làm việc cho tôi :)


Nó gọi phương thức ghi đè onRecieve. Nhưng tôi muốn cách gọi phương thức onUpdate.
Amit Thaper

25

Thử cái này:

int[] ids = AppWidgetManager.getInstance(getApplication()).getAppWidgetIds(new ComponentName(getApplication(), MyWidget.class));
        MyWidget myWidget = new MyWidget();
        myWidget.onUpdate(this, AppWidgetManager.getInstance(this),ids);

2
Thật ngạc nhiên, chỉ câu trả lời nhỏ này đã giải quyết nó. Tôi vẫn không biết ý nghĩa của instantiating lớp Widget và trực tiếp gọi phương thức onUpdate, nhưng hey, cuối cùng nó hoạt động :)
Henrique de Sousa

1
Cảm ơn. Tôi đang thử nghiệm nó ngay bây giờ và sẽ đăng phản hồi. Đã kiểm tra và xác nhận hoạt động. Tôi đang tự hỏi thông qua, nếu có các loại vật dụng khác nhau, nó sẽ hoạt động giống nhau? (+1 nhân tiện để làm việc)
Si8

tôi luôn nhận được id 0
omor

Điều này sẽ không hoạt động trên Android Oreo bất kỳ giải pháp khắc phục nào?
kẹt lại dòng chảy

15

Trong trường hợp bạn đang làm việc với một tiện ích con sử dụng một bộ sưu tập như ListView, GridView hoặc StackView, để cập nhật các mục của tiện ích con, hãy làm như sau:

Context context = getApplicationContext();
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
ComponentName thisWidget = new ComponentName(context, StackWidgetProvider.class);
int[] appWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);
appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.stack_view);

Với phương thức này, InformAppWidgetViewDataChanged (), bạn có thể buộc các mục widget tìm nạp bất kỳ dữ liệu mới nào trong thời gian thực.


12
int widgetIDs[] = AppWidgetManager.getInstance(getApplication()).getAppWidgetIds(new ComponentName(getApplication(), WidgetProvider.class));

for (int id : widgetIDs)
    AppWidgetManager.getInstance(getApplication()).notifyAppWidgetViewDataChanged(id, R.id.widget_view);
}

1
Đòi hỏi mức min-api: 11.
Anirudh Ramanathan

Tuyệt vời. Bạn thậm chí không cần phải lặp lại, có một phiên bản của notifyAppWidgetViewDataChanged()nó có một mảng.
Lawrence Kesteloot ngày

2

Giải pháp được chấp nhận của Phaethon ở Kotlin:

    val intent = Intent(this, MyAppWidgetProvider::class.java)
    intent.action = AppWidgetManager.ACTION_APPWIDGET_UPDATE
    val ids = AppWidgetManager.getInstance(application).getAppWidgetIds(ComponentName(getApplicationContext(),MyAppWidgetProvider::class.java!!))
    intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids)
    sendBroadcast(intent)

Nơi MyAppWidgetProvider được lấy từ AppWidgetProvider:
class MyAppWidgetProvider : AppWidgetProvider() {


2

Nếu bạn đang cố gắng cập nhật tiện ích theo chương trình mà bạn không có quyền truy cập vào YourWidgetProvider.class một cách rõ ràng, chẳng hạn như từ một mô-đun hoặc thư viện khác, bạn có thể nắm bắt những gì YourWidgetProvider.class.getName () xuất ra và tạo một hằng số:

val WIDGET_CLASS_NAME = "com.example.yourapplication.YourWidgetProvider"

Sau đó, bạn sẽ có thể sử dụng điều này một cách ngầm định:

val intent = Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE)
val widgetManager = AppWidgetManager.getInstance(context)
val ids = widgetManager.getAppWidgetIds(ComponentName(context, WIDGET_CLASS_NAME))
AppWidgetManager.getInstance(context).notifyAppWidgetViewDataChanged(ids, android.R.id.list)
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids)
context.sendBroadcast(intent)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.