我为我的任务应用程序实现了一个小部件,我希望它AppWidgetProvider
能够接收自定义数据更改的通知广播。因为我想将这些广播定位到我的应用程序中的已注册组件,WidgetProvider
实例就是其中之一,我正在使用Intent
的setComponent()API。 widgetProvider
仅在我删除对setComponent()
的调用时才接收到意图,并且我将意图过滤器添加到AndroidManifest.xml中的WidgetProvider
组件。如何让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>
答案 0 :(得分:1)
ComponentName
个实例是使用Android软件包名称构建的,而不是使用java软件包名称构建的。如果WidgetProvider.class.getPackage().getName()
不等于AndroidManifest.xml
中指定的包名称,则调用setComponent(cn)
将指向无效的组件。