3

类似的问题:服务未在应用程序小部件中的 oreo 上启动最接近我的问题是小部件在一段时间后冻结但未得到答复。

我有一个简单的小部件按钮,按下时应该发送通知。它在以下情况下不起作用:

  1. 在安装时打开应用程序后,我从最近的应用程序中清除了该应用程序
  2. 有时会随机停止工作(有时在我再次打开应用程序后会同时触发所有点击,从而导致一起触发一堆通知。)

从我目前所读到的所有内容来看,在我看来,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());
        }
    }
}

我如何获得一个每次都能可靠地启动服务的按钮?任何帮助表示赞赏。

4

0 回答 0