Android Widget 随机停止工作
Posted
技术标签:
【中文标题】Android Widget 随机停止工作【英文标题】:Android Widget stops working randomly 【发布时间】:2012-10-14 15:58:32 【问题描述】:我已经解决这个问题三天了,我已经查看了这里的每一个问题以寻求答案。我有一个带有按钮的小部件,我想做的就是在每次单击它时启动一个服务。问题是按钮随机停止工作。我根本无法重新创建它,我不知道是什么原因造成的。我的服务调用 stopSelf();但是我的广播接收器也遇到了这个问题,所以我认为问题出在小部件上,而不是服务上。这是代码
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
Log.i("Widget", "onUpdate");
final int N = appWidgetIds.length;
for (int i=0; i<N; i++)
int appWidgetId = appWidgetIds[i];
Log.i("Widget", "onUpdateLoop");
Intent intent = new Intent(context, ServiceWidgetAction.class);
intent.setAction(Long.toString(System.currentTimeMillis()));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pendingIntent = PendingIntent
.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
RemoteViews views = new RemoteViews(context.getPackageName(),
R.layout.widget);
views.setOnClickPendingIntent(R.id.widgetButton, pendingIntent);
views.setTextViewText(
R.id.widgetTextView,
"Some text");
appWidgetManager.updateAppWidget(appWidgetId, views);
我一遍又一遍地检查了这段代码,但我不知道它为什么会这样。它在 3 部不同的手机上执行此操作,我无法重新创建它。我试过强制停止应用程序,从任务管理器中清除它,添加新的小部件等,以使小部件停止工作,但它不会。但是,当我今天早上醒来时,小部件不再起作用。任何帮助将不胜感激。
【问题讨论】:
发生这种情况时,您在 LogCat 中看到什么了吗? logcat 中没有任何内容,就像在活动中有一个没有 onClick 方法的按钮。我可以看到它已被按下,但应用程序或 logcat 中没有任何反应。 【参考方案1】:我最终找出了问题所在。我正在从应用程序的其他地方更新小部件,但我没有每个地方的完整代码。换句话说,我的应用程序像这样更新了小部件中的文本视图
RemoteViews views = new RemoteViews(context.getPackageName(),
R.layout.widget);
views.setTextViewText(
R.id.widgetTextView,
"Some text");
appWidgetManager.updateAppWidget(appWidgetId, views);
但它需要整个代码来保持按钮注册如下:
Intent intent = new Intent(context, ServiceWidgetAction.class);
intent.setAction(Long.toString(System.currentTimeMillis()));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pendingIntent = PendingIntent
.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
RemoteViews views = new RemoteViews(context.getPackageName(),
R.layout.widget);
views.setOnClickPendingIntent(R.id.widgetButton, pendingIntent);
views.setTextViewText(
R.id.widgetTextView,
"Some text");
appWidgetManager.updateAppWidget(appWidgetId, views);
因此,最重要的是,每当您从应用程序中更新小部件时,请确保它看起来与小部件本身中的代码完全相同。不要遗漏任何东西。
【讨论】:
谢谢。就我而言,总是更新小部件的单一方法在某些情况下可能会抛出异常,并且部分代码不会执行。 这是黄金,等一下 - 它的比特币价值答案 - 10x mate【参考方案2】:您是否将小部件安装到 SD 卡中?
由于此类系统同步问题,Google 建议将所有小部件、警报和接收器应用类型安装到内部存储中。
也许不是解决方案,而是“必须检查”;)
android:installLocation="internalOnly"
【讨论】:
我没有想到这一点,因为我确实将应用程序启用到 SD 但是我只是检查了它并且应用程序已安装到内部存储器中。感谢您的意见!以上是关于Android Widget 随机停止工作的主要内容,如果未能解决你的问题,请参考以下文章