ホーム画面のウィジェットにニュース フィードを表示するアプリを開発しました。次のシナリオの結果として、Lollipop 以前の Android デバイスではすべて問題ありません。
- ユーザーはランチャーのウィジェット画面に入り、特定のウィジェットを選択/追加します
- ユーザーが MyNewsWidget をクリックしてホーム画面に追加する
- ユーザーがさまざまなニュースソースから選択できるように、構成アクティビティが呼び出されます
- ユーザーが構成アクティビティ内の「保存」ボタンをクリックすると、アクティビティが終了し、MyNewsWidget がホーム画面に追加されます。
LG Nexus 5 デバイスでアプリをテストしていますが、構成アクティビティが完了した後にクリックしてウィジェットをホーム画面に追加すると、ウィジェットがホーム画面に追加されません。
構成アクティビティ内のインテントのコードは次のとおりです。
int[] appWidgetIds = new int[]{mWidgetId};
Intent intent = new Intent(WidgetResourcesActivity.this, NewsWidgetProvider.class);
intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);
sendBroadcast(intent);
setResult(RESULT_OK, intent);
finish();
また、これは私の WidgetProvider クラス内のコードです。
@Override
public void onReceive(Context context, Intent intent) {
//I got this result on pre-Lollipop android devices "Action is: ACTION_APPWIDGET_UPDATE"
if (intent.getAction().equals(AppWidgetManager.ACTION_APPWIDGET_UPDATE)) {
int[] appWidgetIds = intent.getExtras().getIntArray(AppWidgetManager.EXTRA_APPWIDGET_IDS);
for (int widgetId : appWidgetIds) {
if (!isWidgetAdded(context, widgetId)) {
Intent widgetIntent = new Intent(Intent.ACTION_MAIN);
widgetIntent.setClass(context, WidgetResourcesActivity.class);
widgetIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
widgetIntent.putExtra(WidgetResourcesActivity.EXTRA_WIDGET_ID, widgetId);
context.startActivity(widgetIntent);
PendingIntent pendingIntent = PendingIntent.getActivity(context, widgetId, widgetIntent, PendingIntent.FLAG_UPDATE_CURRENT);
} else {
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
int[] widgetIds = new int[]{widgetId};
onUpdate(context, appWidgetManager, widgetIds);
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.app_widget);
updateButtonsStatus(remoteViews, 0, mFeedsCount);
AppWidgetManager.getInstance(context).updateAppWidget(appWidgetIds, remoteViews);
}
}
return;
}
//Here is my trouble . . .
//Unfortuantely, I got this result on Lollipop android devices "Action is: ACTION_APPWIDGET_DELETED" !! Why?
if (intent.getAction().equals(AppWidgetManager.ACTION_APPWIDGET_DELETED)) {
if (BuildConfig.DEBUG) Log.e(TAG, "action : " + intent.getAction());
removeWidgetId(context, intent.getExtras().getInt(AppWidgetManager.EXTRA_APPWIDGET_ID));
return;
}
super.onReceive(context, intent);
if (intent.getExtras() == null)
return;
int widgetId = intent.getExtras().getInt(EXTRA_WIDGET_ID);
if (BuildConfig.DEBUG)
Log.e(TAG, "action : " + intent.getAction() + " id : " + intent.getExtras().getInt(EXTRA_BUTTON_ID));
if (intent.getExtras().getInt(EXTRA_BUTTON_ID) == R.id.widget_arrow_back) {
mIndex = intent.getExtras().getInt(EXTRA_FEED_INDEX);
if (mIndex > 0) {
mIndex--;
if (BuildConfig.DEBUG) Log.e(TAG, "currentIndex : " + mIndex);
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.app_widget);
updateButtonsStatus(remoteViews, mIndex, mFeedsCount);
updateWidget(context, remoteViews, mIndex, widgetId);
handleWidgetBackButton(context, remoteViews, widgetId);
handleWidgetNextButton(context, remoteViews, widgetId);
}
}
if (intent.getExtras().getInt(EXTRA_BUTTON_ID) == R.id.widget_arrow_next) {
mIndex = intent.getExtras().getInt(EXTRA_FEED_INDEX);
if (mIndex < mFeedsCount - 1) {
mIndex++;
if (BuildConfig.DEBUG) Log.e(TAG, "currentIndex : " + mIndex);
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.app_widget);
updateButtonsStatus(remoteViews, mIndex, mFeedsCount);
updateWidget(context, remoteViews, mIndex, widgetId);
handleWidgetNextButton(context, remoteViews, widgetId);
handleWidgetBackButton(context, remoteViews, widgetId);
}
}
}
残念ながら、前のシナリオは android Lollipop (5.0 以降) では機能しません。どんな良い助けでも大歓迎です。