別のプロセスで実行されているサービスがあります。メインプロセスのUIスレッドがonDestroy()を終了した後、アプリケーションコンテキストにバインディングを提供し、BIND_AUTO_CREATEを指定したにもかかわらず、サービスが破棄されていることがわかりました。
私のメインプロセスのUIスレッドonCreate()には、次のバインディングコードがあります。
Intent intent = new Intent(mAppContext, MyService.class);
mAppContext.bindService(intent, mMyServiceConnection, Context.BIND_AUTO_CREATE);
私のメインプロセスのUIスレッドonDestroy()には、次のバインド解除コードがあります。
mAppContext.unbindService(mMyServiceConnection);
stopService()を呼び出さないことに注意してください。
bindService()に関するAndroidのドキュメントには次のように書かれています。
サービスは、呼び出しコンテキストが存在する限り、システムによって必要と見なされます。
私がそれを正しく読んでいる場合、私はアプリケーションのコンテキストを提供したので、サービスはアプリケーションの存続期間中システムによって必要とされていると見なされます。
アプリケーションのコンテキストはonDestroy()で死ぬのではないかと思いました。これは、AndroidのドキュメントがgetApplicationContext()について述べていることです。
現在のプロセスの単一のグローバルApplicationオブジェクトのコンテキストを返します。
アプリケーションのコンテキストがonDestroy()で停止する場合、Androidには大きな問題があると思います。問題は、ディスプレイが回転すると、onDestroy()が呼び出されることです(直後にonCreate()が続きます)。したがって、その効果は、ディスプレイが回転したときに発生します-私の場合、それは非常に頻繁に発生します!-私のサービスは常に終了します。
私のアプリのプロセスのpidは決して変更されないことに注意してください。つまり、同じプロセスです。これは、「現在のプロセス」と記載されているgetApplicationContext()のドキュメントに照らして重要です。
これが私のデバッグログが示すものです:
04-03 05:15:12.874:DEBUG / MyApp(841):main onDestroy
04-03 05:15:12.895:DEBUG / MyApp(847):service onUnbind
04-03 05:15:12.895:DEBUG / MyApp(847 ):service onDestroy
04-03 05:15:12.934:DEBUG / MyApp(841):main onCreate
04-03 05:15:12.966:DEBUG / MyApp(847):service onCreate
04-03 05:15:12.975:DEBUG / MyApp(847):サービスonBind
だから私の質問は:
1)バインド/バインド解除についての私の理解は正しいですか?
2)UIスレッドのonDestroy()が呼び出されたときに、サービスが破棄されないようにする方法はありますか?
質問2のハックは、バインドを解除しないことです。しかし、onDestroy()が呼び出されるたびにバインディングがリークしているので、私はそれが好きではありません。リークされたバインディングが1つあることを「覚えて」、それだけをリークすることはできましたが、カスケードされたハックがあり、それは本当に醜いです。