我正在开发一个应用程序,当应用程序启动时我需要启动后台服务。
最初我在 Application.onCreate() 方法中添加了第一个服务的启动过程。
之后,我意识到如果用户出于某种原因停止了后台线程,我需要重新启动服务。因此,我将服务启动代码从 Application.onCreate() 移至主 Activivity.onResume()。
根据文档,在已经运行的服务上调用 startService() 没有问题。
在那之前,一切都很好。我的第一个后台服务实现得很好。当它启动时,它会创建一个新线程来运行后台处理,而不会出现重大问题。
实施第一项服务后,我转到了第二项服务。这里没有问题。但是在实现它并在 Activity.onResume() 方法上添加服务启动调用之后。
private void startServices() {
startTrackingService();
startBacklogService();
}
private void startTrackingService() {
if (Z10.DEBUG) {
Log.i(LOG_TAG, "REQUESTING TRACKING SERVICE START");
}
Intent serviceLauncher = new Intent(Main.this, TrackingService.class);
startService(serviceLauncher);
if (Z10.DEBUG) {
Log.i(LOG_TAG, "TRACKING SERVICE START REQUESTED");
}
}
private void startBacklogService() {
if (Z10.DEBUG) {
Log.i(LOG_TAG, "REQUESTING BACKLOG SERVICE START");
}
Intent serviceLauncher = new Intent(Main.this, BacklogService.class);
startService(serviceLauncher);
if (Z10.DEBUG) {
Log.i(LOG_TAG, "BACKLOG SERVICE START REQUESTED");
}
}
这段代码阻塞了 main 方法并且应用程序必须被杀死。
尝试调试应用程序(没有android源代码很难!!!),我意识到startService并没有真正启动服务,它只是将操作添加到待处理的Looper队列上。
如果我按顺序执行两个 startService 操作,主线程会阻塞,但如果在主线程上执行其他操作(与 UI 相关)之后,然后启动第二个服务,它就可以正常工作。
问题是我真的需要在应用程序启动时启动这两个服务,或者在主活动恢复时重新启动它们中的任何一个。