読者です 読者をやめる 読者になる 読者になる

ほげほげ(仮)

仮死状態

AppWidgetProviderからServiceにappWidgetIdを渡す方法

Android


最近、Andoridのウィジェットについて色々と調べてます。
普通のActivityと違うところが多くてかなり戸惑ってます。


ウィジェットのボタンを押されたとき、ServiceにappWidgetIdが渡せないか調べた結果です。
ウィジェットはホームスクリーンに複数設置できるので、それを区別したいと思いました。


TestWidget.java

public class TestWidget extends AppWidgetProvider {

    private static final String TAG = "TestWidget";

    private static final String BUTTON_CLICK_ACTION = "BUTTON_CLICK_ACTION";

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        super.onUpdate(context, appWidgetManager, appWidgetIds);

        for (int appWidgetId: appWidgetIds) {

            Log.d(TAG, "appWidgetId:" + appWidgetId);

            // View取得
            RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget);

            // ボタンイベント設定
            Intent intent = new Intent();
            intent.setAction(BUTTON_CLICK_ACTION);
            intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
            PendingIntent pendingIntent = PendingIntent.getService(context, appWidgetId, intent, PendingIntent.FLAG_UPDATE_CURRENT);
            remoteViews.setOnClickPendingIntent(R.id.button, pendingIntent)

            // ウィジェット更新
            appWidgetManager.updateAppWidget(appWidgetId, remoteViews);
        }
    }
}


TestWidgetService.java

public class TestWidgetService extends Service {

    private static final String TAG = "TestWidgetService";

    @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);

        // appWidgetId取得
        int appWidgetId = intent.getExtras().getInt(AppWidgetManager.EXTRA_APPWIDGET_ID);
        Log.d(TAG, "appWidgetId:" + appWidgetId);

    }
}

AndroidManifest.xml(一部抜粋)

<service android:name=".TestWidgetService">
    <intent-filter>
        <action android:name="BUTTON_CLICK_ACTION" />
    </intent-filter>
</service>


ポイントとしてはPendingIntent.getServiceの引数です。


よくあるサンプルとしては

PendingIntent.getService(context, 0, intent, 0)

というのを見かけますが、コレだと正しいappWidgetIdが取得できません。
上のサンプルのように引数を設定する必要があります。


今回はAppWidgetProvider#onStartでボタンイベントを設定しましたが、Serviceで設定する場合もほぼ同じです。


ちなみに検証したバージョンは2.1、2.2、2.3です。