我为我的任务应用程序实现了一个小部件,我希望它AppWidgetProvider
接收自定义数据更改通知广播。因为我想将这些广播定位到我的应用程序中的注册组件,WidgetProvider
实例就是其中之一,所以我使用Intent
的是 setComponent() API。widgetProvider
只有当我删除调用setComponent()
并将意图过滤器添加到WidgetProvider
AndroidManifest.xml 中的组件时,才会收到意图。我怎么setComponent()
去上班?下面是我正在使用的代码的表示。
package com.mypackage.widgets;
public class WidgetProvider extends AppWidgetProvider {
static {
MyActivity.registerChangeListener( new ComponentName(
WidgetProvider.class.getPackage().getName(), WidgetProvider.class.getName() ) );
}
...
@Override
public void onReceive( Context ctx, Intent intent ) {
final String action = intent.getAction();
if( MyActivity.FETCH_DATA_ACTION.equals( action ) ) {
// This only runs when I *don't* call setComponent() on the intent
...
// fetch data
...
}
}
...
}
...
package com.mypackage;
public class MyActivity extends Activity {
public static final String FETCH_DATA_ACTION = "com.mypackage.MyActivity.FETCH_DATA";
private static ArrayList<ComponentName> sChangeListeners = new ArrayList<ComponentName>();
public static void registerChangeListener( ComponentName cn ) {
sChangeListeners.add( cn );
}
private static void notifyChangeListeners() {
for( ComponentName cn: sChangeListeners ) {
Intent intent = new Intent();
intent.setAction( FETCH_DATA_ACTION );
intent.setComponent( cn );
sendBroadcast( intent );
}
}
...
changeData();
notifyChangeListeners();
...
}
WidgetProvider 在我的 AndroidManifest 中注册如下:
<receiver android:name=".widgets.WidgetProvider"
android:exported="false">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
<action android:name="android.appwidget.action.APPWIDGET_DELETED" />
<action android:name="android.appwidget.action.APPWIDGET_ENABLED" />
<action android:name="android.appwidget.action.APPWIDGET_DISABLED" />
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/widget_info" />
</receiver>