1

次のコマンドを使用して、メイン アクティビティでサービスを開始する Android アプリケーションがあります。

bindService(new Intent(ctx, MyService.class), _connection, Context.BIND_AUTO_CREATE);

メイン アクティビティは、このサービスに対してまったく何もしません (そのため、サービス接続のコードを提供しませんでした)。アイデアは、メイン アクティビティがサービスの有効期間を処理するということです。

ユーザーがアプリの「閉じる」ボタンをクリックした後、このコードでサービスを「停止」します。

if (_service != null) {
    unbindService(_connection);
}
//Some cleanup here ...
System.exit(0);

この時点で、他のアクティビティがサービスにバインドされていないことがわかっています。これは、すべてのアクティビティがメイン アクティビティから呼び出され、「onStop」でサービスからバインド解除されるためです。

問題は、ユーザーがアプリを閉じたときに、サービスが「onDestroy」を呼び出さないことです! 「System.exit(0)」行を削除すると、正常に閉じます!

この状況でサービスが適切に閉じられていることを確認するにはどうすればよいですか?

編集:

わかりました、このディスカッションを読みました:アプリケーションを終了することは眉をひそめていますか? .

今、私は自分の活動を再構築しています。startService でサービスを呼び出すアクティビティが 1 つあります。その後、サービスをバインドします。アクティビティが破棄されると、unbindService が呼び出されます。

サービス自体は、onStartCommand で START_STICKY を返し、それを強制終了しにくくしています。すべての作業が完了すると、stopSelf が呼び出されます。

バインディングがまだ存在する場合、 ServiceConnectionLeaked メッセージが表示されるという問題があります。それについてはどうですか?どうすればこれを防ぐことができますか?

4

1 に答える 1