我为我的应用程序创建了一个 AppWidget,并将 updatePeriodMillis 设置为 0, 因为如果用户不交互,这个 Widget 不会做任何事情。
一切正常,直到 Android 清理内存。然后小部件将不再响应,直到应用程序再次启动或设备重新启动(在这两种情况下 onUpdate() 将再次运行)。
所以我的问题是:在 Android 踢出应用程序后,我需要做什么才能让它恢复工作?
这是 list 的一部分:
<receiver android:name="WidgetProvider" >
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
<action android:name="PATH.widgetBtnStartClicked" />
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/appwidget_provider_info" />
</receiver>
这是我的 WidgetProvider 的一部分:
public class WidgetProvider extends AppWidgetProvider {
private static final String BTN_START_CLICKED = "PATH.widgetBtnStartClicked";
private static Values values;
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
super.onUpdate(context, appWidgetManager, appWidgetIds);
// get RemoteView (widget):
for (int i = 0; i < appWidgetIds.length; i++) {
int appWidgetId = appWidgetIds[i];
RemoteViews views = new RemoteViews(context.getPackageName(),
R.layout.appwidget);
// Register onClick for App-start-button:
Intent intentLaunch = new Intent(BTN_APP_LAUNCH_CLICKED);
intentLaunch.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pendingIntentLaunch = PendingIntent.getBroadcast(
context, appWidgetId, intentLaunch,
PendingIntent.FLAG_UPDATE_CURRENT);
views.setOnClickPendingIntent(R.id.appwidget_btn_launch,
pendingIntentLaunch);
appWidgetManager.updateAppWidget(appWidgetId, views);
}
}
@Override
public void onReceive(Context context, Intent intent) {
RemoteViews views = new RemoteViews(context.getPackageName(),
R.layout.appwidget);
super.onReceive(context, intent);
AppWidgetManager appWidgetManager = AppWidgetManager
.getInstance(context);
ComponentName componentName = new ComponentName(context,
WidgetProvider.class);
if (intent.getAction().equals(BTN_APP_LAUNCH_CLICKED)) {
//do some stuff..
}
// update views
appWidgetManager.updateAppWidget(componentName, views);
}
我希望这里有您理解问题所需的一切。如果没有,请告诉我!
最佳答案
我认为您的应用仅依赖于 onUpdate() 来刷新小部件。还有其他事件会导致挂起的 Intent “放弃”小部件。 比如你说的内存清理。
我向您推荐:
+ 将您的小部件更新代码放在单独的服务类中
+ 当不同的事件发生时触发该类。 onUpdate() 和其他事件,例如导致您的 RAM 被清除的事件。
+ 确保每次使用远程 View 更新所有内容,因为没有保留任何旧的未决 Intent 等。
您可以完全控制触发小部件更新的事件。
如果适合您的情况,您还可以使用 alarmmanager 和接收器类设置任意警报。这样,您可以将闹钟设置为仅在手机唤醒时收到,并使用它来调用您的更新服务类。在您的更新服务类中,然后清除任何警报(如果更新是从另一个事件调用的)并设置另一个警报。
SO 上有很多关于谁使用带有小部件的服务的问题。解决它应该不会花很长时间。将该信息放在这里超出了这个问题的范围。
关于Android AppWidget onClick 在垃圾收集后无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19693626/