我的app小部件存在问题/问题。我创建了一个带有6个按钮的app小部件,我用6个动作(在清单和onUpdate()方法中)对这6个按钮进行了比较。因为如果用户按下其中一个我可以对此作出反应。但是在默认时间后我没有收到回复,听起来好像appwidgetmanager没有工作。
问题是,如果我将设备连接到电脑,它可以工作,例如。 1周,但是当我以正常方式使用智能手机时(我没有连接电脑,我一整天都使用它),当天结束时appwidget没有响应,按钮没有响应。
Widget必须只显示一些文本,因此我禁用了更新周期 - > appwidget只在onUpdate()方法中运行一次。
现在问题:我必须实施更新周期,我可以证明appwidget在一天结束时仍然存在或者是另一个问题/问题吗?
问候 马努
答案 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中的错误,但它就是这样。