Android AppWidget没有添加到Lollipop上的主屏幕

时间:2015-03-04 12:29:23

标签: android android-appwidget appwidgetprovider

我开发了一个在主屏幕小部件上显示新闻Feed的应用。由于以下情况,在Lollipop之前的Android设备上一切正常:

  • 用户输入其启动器的小部件屏幕以选择/添加特定小部件
  • 用户点击MyNewsWidget以添加到其主屏幕
  • 调用配置活动,以便用户可以从不同的新闻来源中选择
  • 用户点击配置活动中的“保存”按钮,然后活动结束,MyNewsWidget应添加到主屏幕。

我正在LG Nexus 5设备上测试我的应用程序,但是当我在配置活动完成后点击将我的窗口小部件添加到主屏幕时,窗口小部件不会添加到主屏幕。

以下是我在Configuration活动中的Intent代码:

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及更高版本)。 任何好的帮助将不胜感激。

0 个答案:

没有答案