0

我为我的任务应用程序实现了一个小部件,我希望它AppWidgetProvider接收自定义数据更改通知广播。因为我想将这些广播定位到我的应用程序中的注册组件,WidgetProvider实例就是其中之一,所以我使用Intent的是 setComponent() API。widgetProvider只有当我删除调用setComponent()并将意图过滤器添加到WidgetProviderAndroidManifest.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>
4

1 回答 1

1

ComponentName实例是使用 Android 包名而不是 java 包名构建的。如果WidgetProvider.class.getPackage().getName()不等于 中指定的包名称AndroidManifest.xml,则调用setComponent(cn)将指向无效组件。

于 2013-11-02T03:07:26.353 回答