如何针对具有意图的特定AppWidgetProvider?

时间:2013-11-02 02:31:01

标签: android android-intent android-widget

我为我的任务应用程序实现了一个小部件,我希望它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>

1 个答案:

答案 0 :(得分:1)

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