Android 当应用程序被终止时,小部件 PendingIntent 停止工作
Android widget PendingIntent stop working when app is killed
我已经为这个问题寻找了一个星期的解决方案。
当我的应用 运行 在后台运行时,小部件上的 onclicks 事件按预期工作。
但是当应用程序关闭(被任务管理器杀死)时,小部件的 PendingIntents 停止工作。
怎么可能?
我想我已经正确创建了小部件提供程序。
少了什么?
有人可以帮助我吗?
这是我的代码:
- compileSdk 31
- minSdk 23
- targetSdk 31
- gradle -> "com.android.tools.build:gradle:7.0.4"
供应商class:
public class GPWidgetProvider extends AppWidgetProvider {
private static RemoteViews getRemoteViews(Context context) {
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget);
Intent intentHome = new Intent(context, Home.class);
intentHome.setData(Uri.parse(intentHome.toUri(Intent.URI_INTENT_SCHEME)));
intentHome.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
PendingIntent homePendingIntent = PendingIntent.getActivity(context, 13, intentHome, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT);
views.setOnClickPendingIntent(R.id.widget_image, homePendingIntent);
return views;
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
for (int appWidgetId : appWidgetIds) {
RemoteViews views = getRemoteViews(context);
appWidgetManager.updateAppWidget(appWidgetId, views);
}
super.onUpdate(context, appWidgetManager, appWidgetIds);
}
public static void updateWidget(Context context) {
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
ComponentName widget = new ComponentName(context, GPWidgetProvider.class);
int[] appWidgetIds = appWidgetManager.getAppWidgetIds(widget);
for (int appWidgetId : appWidgetIds) {
RemoteViews views = getRemoteViews(context);
appWidgetManager.updateAppWidget(appWidgetId, views);
}
}
}
清单:
<receiver
android:name="<myPackage>.GPWidgetProvider"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_ENABLED" />
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
<action android:name="android.appwidget.action.APPWIDGET_DELETED" />
<action android:name="android.appwidget.action.APPWIDGET_DISABLED" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widget_info" />
</receiver>
提前致谢。
如果某个应用程序被例如被杀死用户强制停止,应用程序中的所有服务、活动、通知和 PendingIntents 都将被取消。只有在您的应用下次运行时(从 activity 启动、接收广播等),您才有机会恢复。
这就是系统警告用户如果强制停止应用可能无法正常运行的原因。
我已经为这个问题寻找了一个星期的解决方案。
当我的应用 运行 在后台运行时,小部件上的 onclicks 事件按预期工作。 但是当应用程序关闭(被任务管理器杀死)时,小部件的 PendingIntents 停止工作。
怎么可能? 我想我已经正确创建了小部件提供程序。
少了什么?
有人可以帮助我吗?
这是我的代码:
- compileSdk 31
- minSdk 23
- targetSdk 31
- gradle -> "com.android.tools.build:gradle:7.0.4"
供应商class:
public class GPWidgetProvider extends AppWidgetProvider {
private static RemoteViews getRemoteViews(Context context) {
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget);
Intent intentHome = new Intent(context, Home.class);
intentHome.setData(Uri.parse(intentHome.toUri(Intent.URI_INTENT_SCHEME)));
intentHome.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
PendingIntent homePendingIntent = PendingIntent.getActivity(context, 13, intentHome, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT);
views.setOnClickPendingIntent(R.id.widget_image, homePendingIntent);
return views;
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
for (int appWidgetId : appWidgetIds) {
RemoteViews views = getRemoteViews(context);
appWidgetManager.updateAppWidget(appWidgetId, views);
}
super.onUpdate(context, appWidgetManager, appWidgetIds);
}
public static void updateWidget(Context context) {
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
ComponentName widget = new ComponentName(context, GPWidgetProvider.class);
int[] appWidgetIds = appWidgetManager.getAppWidgetIds(widget);
for (int appWidgetId : appWidgetIds) {
RemoteViews views = getRemoteViews(context);
appWidgetManager.updateAppWidget(appWidgetId, views);
}
}
}
清单:
<receiver
android:name="<myPackage>.GPWidgetProvider"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_ENABLED" />
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
<action android:name="android.appwidget.action.APPWIDGET_DELETED" />
<action android:name="android.appwidget.action.APPWIDGET_DISABLED" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widget_info" />
</receiver>
提前致谢。
如果某个应用程序被例如被杀死用户强制停止,应用程序中的所有服务、活动、通知和 PendingIntents 都将被取消。只有在您的应用下次运行时(从 activity 启动、接收广播等),您才有机会恢复。
这就是系统警告用户如果强制停止应用可能无法正常运行的原因。