首页 > 解决方案 > 后台服务偶尔崩溃

问题描述

当我的应用程序处于空闲状态时,即没有人在使用该应用程序或它已关闭但后台服务正在连续运行。我的应用程序中的后台服务崩溃了。它只发生了两次。它不会定期发生。我在 Crashlytics 上没有任何堆栈跟踪,但只有一个显示应用程序在Runnable接口函数上崩溃的崩溃报告run()(附屏幕截图)

在此处输入图像描述

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        context = getApplicationContext();

        handler = new Handler();
        handler.removeCallbacks(restartThread);
        handler.post(restartThread);
        return START_STICKY;
    }

    private Runnable restartThread = new Runnable() {
        @Override
        public void run() {
            handler.postDelayed(restartThread, NOTIFY_INTERVAL);
        }
    };

由于内存不足,操作系统是否可能正在杀死后台服务?

标签: javaandroidbackground-service

解决方案


这种实现很可能存在许多问题。后台服务在现代版本的 Android 上被阻止,甚至在运行类似服务(带有 Runnable 循环)的旧版本上也非常容易出错。

截至 2018 年,运行计划任务的最佳实践方式是使用 Android 架构组件中的 WorkManager 库。

WorkManager 选择适当的方式来安排后台任务——根据设备 API 级别和包含的依赖项,WorkManager 可能使用 JobScheduler、Firebase JobDispatcher 或 AlarmManager。您无需编写设备逻辑来确定设备具有哪些功能并选择合适的 API;相反,您可以将任务交给 WorkManager 并让它选择最佳选项。

https://developer.android.com/topic/libraries/architecture/workmanager

您可以像这样定义任务

public class CustomWorker extends Worker {
  ...
}

然后像这样安排它

new PeriodicWorkRequest.Builder photoWorkBuilder =
        new PeriodicWorkRequest.Builder(CustomWorker.class, 12,
                TimeUnit.HOURS);
// ...if you want, you can apply constraints to the builder here...

// Create the actual work object:
PeriodicWorkRequest work = customWorkerBuilder.build();
// Then enqueue the recurring task:
WorkManager.getInstance().enqueue(work);

推荐阅读