0

AppWidgetProviderタスク アプリケーション用のウィジェットを実装しました。カスタム データ変更通知ブロードキャストを受信したいと考えています。これらのブロードキャストをアプリ内の登録済みコンポーネント (WidgetProviderインスタンスはその 1 つ) に向けたいので、Intentの setComponent() API を使用しています。へのwidgetProvider呼び出しを削除し、AndroidManifest.xmlsetComponent()のコンポーネントにインテント フィルターを追加した場合にのみ、インテントを受信します。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>
4

1 に答える 1