私のコードでDeadObjectException
を取得しています。以下では、セットアップについて説明し、問題を解決しようとしているものについて説明します。死んだサービスでDeadObjectExceptionを処理するには?
Service
SはApplication
から開始されます。 (他のアプリケーションから)
Activity
BはMessenger
とIBinder
インターフェースを使用してそのサービスと通信します。このアクティビティは同じサービスからも開始されます。このアクティビティの中のボタンを押すと、私はサービスにメッセージを送り返すことになっています。私はよくボタンを押すとDeadObjectException
が得られます。
これは、システムを強制終了してサービスを再起動し、アクティビティに古い参照がある可能性が高いことを理解しています。これを超えて、私は多くの情報をオンラインで見つけられませんでした。
これは私が試したものです:
- を私はサービスで
startForeground()
を使用し、私はサービスを継続的に(通知領域の通知を)実行していたことを見ることができました。私はまだ例外があります。 - システムの再起動時に、私はこの例外をしばらく取得しません。
- 例外は断続的です。私は100%のレプロを持っていません。ただし、次のシナリオでは、常に例外が発生します。
- サービスを開始します(これもサービスSを開始します)。
- アクティビティBを開始すると、すべて正常に動作します。
- アプリケーションAを再デプロイしてサービスを再起動してください。
- アクティビティBにナビゲートしてください。例外は、で発生します。
- この時点で、アクティビティBを再起動すると、例外が表示されなくなります。
- これは、サービスが開始されるたびにアクティビティBが新鮮であることを確認した場合、この例外は消滅すると結論づけました。私はその後、それを開始する前に、活動Bに殺人意図を送ろうとしました。 (アクティビティには
BroadcastReceiver
があり、onReceive()
にはfinish()
がコールされます)。問題は、アクティビティが一時停止すると、Intent
が配信されないということです。また、Androidがアクティビティのライフサイクルを管理しているため、インテントが配信されることが保証されていないため、onDestroy()
が簡単にヒットしています。私はまた、BaseActivity
をthis stackoverflow question. - のように拡張しようとしました。私はまた、
FLAG_ACTIVITY_CLEAR_TASK
(通常のFLAG_ACTIVITY_NEW_TASK
に加えて)を設定しようとしましたが、良い結果は得られませんでした。
今、私はオプションがないように感じます。誰も同じような問題に直面していますか?私が試すことができるものはありますか?例外をキャッチしてサービスを再バインドすることは可能ですか?