0

我的应用小部件存在问题/问题。我创建了一个带有 6 个按钮的应用程序小部件,我将这 6 个按钮与 6 个操作组合在一起(在清单和 onUpdate() 方法中)。因为如果用户按下其中之一,我可以对此做出反应。但是在默认时间之后我没有得到响应,听起来 appwidgetmanager 无法正常工作。

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

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

现在的问题:我必须实施更新期,我可以证明 appwidget 在一天结束时仍然存在还是其他问题/问题?

问候马努

4

2 回答 2

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 ....

希望这可以帮助...

于 2013-06-25T00:10:55.973 回答
0

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

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

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

于 2013-06-24T20:41:33.547 回答