java - 后台服务偶尔崩溃
问题描述
当我的应用程序处于空闲状态时,即没有人在使用该应用程序或它已关闭但后台服务正在连续运行。我的应用程序中的后台服务崩溃了。它只发生了两次。它不会定期发生。我在 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);
}
};
由于内存不足,操作系统是否可能正在杀死后台服务?
解决方案
这种实现很可能存在许多问题。后台服务在现代版本的 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);
推荐阅读
- python - “.replace”运算符不工作 Python
- android-studio - 待办事项列表:复选框激活列表中的每个成员
- arrays - 用尽所有 onTap 功能时无法显示对话框
- kubernetes - Kubeadm 替换节点
- java - 如何在sqlite数据库java中存储对象
- java - 如何对除 api 网关之外的所有人隐藏我的公共微服务?
- python-3.x - 尝试通过 kudu 控制台在 python azure 函数中添加模块(speech_py_impl),但面临虚拟环境问题
- c# - CommandBinding 使用自定义 ICommand 实现时未调用已执行的事件处理程序
- python - 在 Python 中使用 OpenCV 确定图像中所有圆形(重叠)斑点的半径
- python - 非均匀间距,带有 numpy.gradient 的多元导数