アプリケーションの起動時にバックグラウンド サービスを開始する必要があるアプリケーションを開発しています。
最初に、Application.onCreate() メソッドに最初のサービスの起動手順を追加しました。
その後、何らかの理由でユーザーがバックグラウンド スレッドを停止した場合は、サービスを再起動する必要があることに気付きました。したがって、サービスの起動コードを Application.onCreate() からメインの Activivity.onResume() に移動しました。
ドキュメントによると、すでに実行中のサービスで startService() を呼び出しても問題はありません。
それまでは、すべて順調でした。私の最初のバックグラウンド サービスは問題なく実装されました。起動すると、大きな問題なくバックグラウンド処理を実行する新しいスレッドが作成されます。
最初のサービスを実装した後、2 つ目のサービスに移行しました。ここでは問題ありません。しかし、それを実装し、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");
}
}
このコードはメイン メソッドをブロックし、アプリケーションを強制終了する必要があります。
アプリケーションをデバッグしようとすると (Android のソース コードがないと非常に困難です!!!)、startService は実際にはサービスを開始するのではなく、処理する Looper キューに操作を追加するだけであることに気付きました。
2 つの startService 操作を順番に実行すると、メイン スレッドがブロックされますが、メイン スレッドで他の操作 (UI 関連) を実行した後、2 番目のサービスを開始すると、問題なく動作します。
問題は、アプリケーションの起動時に両方のサービスを開始するか、メイン アクティビティの再開時にいずれかのサービスを再起動する必要があることです。