Android应用程序小部件的生命周期

时间:2013-06-24 20:25:18

标签: android android-appwidget android-lifecycle

我的app小部件存在问题/问题。我创建了一个带有6个按钮的app小部件,我用6个动作(在清单和onUpdate()方法中)对这6个按钮进行了比较。因为如果用户按下其中一个我可以对此作出反应。但是在默认时间后我没有收到回复,听起来好像appwidgetmanager没有工作。

问题是,如果我将设备连接到电脑,它可以工作,例如。 1周,但是当我以正常方式使用智能手机时(我没有连接电脑,我一整天都使用它),当天结束时appwidget没有响应,按钮没有响应。

Widget必须只显示一些文本,因此我禁用了更新周期 - > appwidget只在onUpdate()方法中运行一次。

现在问题:我必须实施更新周期,我可以证明appwidget在一天结束时仍然存在或者是另一个问题/问题吗?

问候 马努

2 个答案:

答案 0 :(得分:2)

将updatePeriodMillis设置为900000毫秒是个好主意。这将每15分钟调用一次onUpdate方法。在onUpdate方法中,您可以“刷新”远程视图的待处理意图。您可以做的另一件事是每次更改远程视图时执行窗口小部件更新。例如,用户按下按钮执行您必须执行的操作,然后执行小部件更新。

系统会破坏待处理的意图有很多原因,因此会使您的远程视图失效,而且所有这些都很难找到并理解,因此最佳做法是暂时更新您的窗口小部件。

我的研究表明,15分钟是一个很好的时间框架。例如,这是我的onUpdate方法,对于包含许多按钮的小部件,它每15分钟运行一次:

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

    FullWidgetPreferencesHelper wp;

    // If no specific widgets requested, collect list of all
    if (appWidgetIds == null) {
        appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, FullWidgetProvider.class));
    }

    for (int widgetId : appWidgetIds) {
        Commands.FullWidgetUpdate(context, widgetId, 0); //<-- Update το widgetId
    }
}

和FullWidgetUpdate方法是这样的:

...
    views.setInt(R.id.cmdwifi, "setBackgroundResource", ThemeResources.getThemeResource(themeId, R.drawable.btn_bck_topleft_black));
    views.setInt(R.id.cmdbluetooth, "setBackgroundResource", ThemeResources.getThemeResource(themeId, R.drawable.btn_bck_middle_black));
    views.setInt(R.id.cmddata, "setBackgroundResource", ThemeResources.getThemeResource(themeId, R.drawable.btn_bck_middle_black));
    views.setInt(R.id.cmdsync, "setBackgroundResource", ThemeResources.getThemeResource(themeId, R.drawable.btn_bck_middle_black));
    views.setInt(R.id.cmdflight, "setBackgroundResource", ThemeResources.getThemeResource(themeId, R.drawable.btn_bck_middle_black));
    views.setInt(R.id.cmdgps, "setBackgroundResource", ThemeResources.getThemeResource(themeId, R.drawable.btn_bck_middle_black));
    views.setInt(R.id.cmdorientation, "setBackgroundResource", ThemeResources.getThemeResource(themeId, R.drawable.btn_bck_middle_black));
    views.setInt(R.id.cmdvolume, "setBackgroundResource", ThemeResources.getThemeResource(themeId, R.drawable.btn_bck_topright_black));
...
        final int PendingIntentFLAG = PendingIntent.FLAG_UPDATE_CURRENT;

    Intent iWiFi = new Intent(cx, CommandsReceiver.class).setAction(CommandsReceiver.cmdwifi).setData(Uri.parse("custom:" + widgetID));
    PendingIntent piWiFi = PendingIntent.getBroadcast(cx, 0, iWiFi, PendingIntentFLAG);
    views.setOnClickPendingIntent(R.id.cmdwifi, piWiFi);

    Intent iBT = new Intent(cx, CommandsReceiver.class).setAction(CommandsReceiver.cmdbt).setData(Uri.parse("custom:" + widgetID));
    PendingIntent piBT = PendingIntent.getBroadcast(cx, 0, iBT, PendingIntentFLAG);
    views.setOnClickPendingIntent(R.id.cmdbluetooth, piBT);
... and so on for other buttons ....

希望这会有所帮助......

答案 1 :(得分:0)

每次更新其中一个视图时,是否更新窗口小部件中的每个视图?

上次检查时,您每次都必须更新每个视图,否则视图迟早会变得无法响应。换句话说,如果你有6个按钮和2个文本视图,并且你想要更新其中一个文本视图,你还需要更新其他文本视图和按钮(当然早些时候发送给他们的信息相同)。

它可能是也可能不是Android中的错误,但它就是这样。