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>