1

我有主屏幕小部件,它有一个简单的AppWidgetProviderand JobIntentService,我可以在其中完成所有工作。

问题是 - 它的工作方式是随机的。有时会,有时不会 - 最奇怪的是,我可以在日志中看到,每个小部件更新enqueueWork方法JobIntentService总是被调用,但onHandleWork方法只是有时。

(我发现与电池优化有很强的相关性,虽然不是 100%。如果我打开“自动管理应用程序”,那么它 99% 可靠地工作。如果打开它,就像抛硬币一样。有时确实如此,有时它不会。最好的说明行为是这个简短的简单视频

这是我的代码(小部件提供者):

public class MyWidgetProvider extends AppWidgetProvider {
    
    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        Log.v("aaa", "onUpdate");
        // super.onUpdate(context, appWidgetManager, appWidgetIds);

        // update in my own Service (to avoid ANR)
        Intent intent = new Intent(context, MyJobIntentService.class);
        intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
        MyJobIntentService.enqueueWork(context, intent);
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.v("aaa", "onReceive");

        super.onReceive(context, intent);
    }
}

这是我做所有工作的服务(JobIntentService):

public class MyJobIntentService extends JobIntentService {

    public static final int JOB_ID = 1;

    public static void enqueueWork(Context context, Intent work) {
        Log.v("aaa", "enqueueWork: ");
        enqueueWork(context, MyJobIntentService .class, JOB_ID, work);
    }

    @Override
    protected void onHandleWork(Intent intent) {
        Log.v("aaa", "onHandleWork: ");
    }
    
}
4

1 回答 1

2

这也是发生在我身上的事情。我发现在android文档中,它说:

当作为 pre-O 服务运行时,入队工作的行为通常会立即启动服务,无论设备是在打瞌睡还是处于其他状态。当作为作业运行时,它将受 JobInfo.Builder.setOverrideDeadline(long) 为 0 的作业的标准 JobScheduler 策略的约束:当设备打瞌睡时,作业不会运行,它可能会比服务延迟更多,如果该设备承受着强大的内存压力,需要大量运行作业。

这意味着在Android O及以上设备中,不保证jobIntentService立即启动,而是根据设备情况延迟启动。但是,一些手机制造商故意取消这项工作以延长电池寿命(如 OnePlus)。所以这个工作永远不会被调用。

我使用的解决方法是创建一个 LOW_IMPORTANCE 前台服务并使用以下方法调用它:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    context.startForegroundService(startIntent);
} else {
    context.startService(startIntent);
}

但缺点是通知会显示一小段时间,直到工作完成。

也许谷歌应该对设备制造商如何管理后台应用程序进行一些限制。

于 2020-08-31T07:34:34.690 回答