类似的问题:服务未在应用程序小部件中的 oreo 上启动最接近我的问题是小部件在一段时间后冻结但未得到答复。
我有一个简单的小部件按钮,按下时应该发送通知。它在以下情况下不起作用:
- 在安装时打开应用程序后,我从最近的应用程序中清除了该应用程序
- 有时会随机停止工作(有时在我再次打开应用程序后会同时触发所有点击,从而导致一起触发一堆通知。)
从我目前所读到的所有内容来看,在我看来,PendingIntent 似乎正在被清除。
代码主要取自官方应用小部件指南,除了启动服务而不是活动。
小部件提供者:
public class WidgetProvider extends AppWidgetProvider {
@RequiresApi(api = Build.VERSION_CODES.O)
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
final int N = appWidgetIds.length;
for (int appWidgetId : appWidgetIds) {
Intent myIntent = new Intent(context, WidgetService.class);
myIntent .setAction("SOME_UNIQUE_ACTION");
PendingIntent pendingIntent = PendingIntent.getForegroundService(context, 0, myIntent, PendingIntent.FLAG_UPDATE_CURRENT);
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
views.setOnClickPendingIntent(R.id.button, pendingIntent);
appWidgetManager.updateAppWidget(appWidgetId, views);
}
}
}
小部件服务:
public class WidgetService extends JobIntentService {
public WidgetService() {
super();
}
@Override
protected void onHandleWork(@Nullable Intent i) {
Utils.sendNotification(); // this method works and is tested
}
}
我从这里尝试了两个答案,广播方法不起作用并且看起来也是间接的,所以我添加#onCreate
了调用 startForeground 的实现,这也不起作用。
@Override
public void onCreate() {
super.onCreate();
Utils.sendNotification();
try {
startForeground(1, notification);
} catch (Error e) {
Log.i(TAG, e.toString());
}
}
}
我如何获得一个每次都能可靠地启动服务的按钮?任何帮助表示赞赏。