2011-11-06 14 views
7

私のコードでDeadObjectExceptionを取得しています。以下では、セットアップについて説明し、問題を解決しようとしているものについて説明します。死んだサービスでDeadObjectExceptionを処理するには?


ServiceSApplicationから開始されます。 (他のアプリケーションから)

ActivityBMessengerIBinderインターフェースを使用してそのサービスと通信します。このアクティビティは同じサービスからも開始されます。このアクティビティの中のボタンを押すと、私はサービスにメッセージを送り返すことになっています。私はよくボタンを押すとDeadObjectExceptionが得られます。

これは、システムを強制終了してサービスを再起動し、アクティビティに古い参照がある可能性が高いことを理解しています。これを超えて、私は多くの情報をオンラインで見つけられませんでした。

これは私が試したものです:

  • を私はサービスでstartForeground()を使用し、私はサービスを継続的に(通知領域の通知を)実行していたことを見ることができました。私はまだ例外があります。
  • システムの再起動時に、私はこの例外をしばらく取得しません。
  • 例外は断続的です。私は100%のレプロを持っていません。ただし、次のシナリオでは、常に例外が発生します。
    1. サービスを開始します(これもサービスSを開始します)。
    2. アクティビティBを開始すると、すべて正常に動作します。
    3. アプリケーションAを再デプロイしてサービスを再起動してください。
    4. アクティビティBにナビゲートしてください。例外は、で発生します。
    5. この時点で、アクティビティBを再起動すると、例外が表示されなくなります。
  • これは、サービスが開始されるたびにアクティビティBが新鮮であることを確認した場合、この例外は消滅すると結論づけました。私はその後、それを開始する前に、活動Bに殺人意図を送ろうとしました。 (アクティビティにはBroadcastReceiverがあり、onReceive()にはfinish()がコールされます)。問題は、アクティビティが一時停止すると、Intentが配信されないということです。また、Androidがアクティビティのライフサイクルを管理しているため、インテントが配信されることが保証されていないため、onDestroy()が簡単にヒットしています。私はまた、BaseActivitythis stackoverflow question.
  • のように拡張しようとしました。私はまた、FLAG_ACTIVITY_CLEAR_TASK(通常のFLAG_ACTIVITY_NEW_TASKに加えて)を設定しようとしましたが、良い結果は得られませんでした。

今、私はオプションがないように感じます。誰も同じような問題に直面していますか?私が試すことができるものはありますか?例外をキャッチしてサービスを再バインドすることは可能ですか?

答えて

2

アクティビティBでは、IBinder.DeathRecipientインターフェイス(カスタムクラスでラップされている可能性があります)を実装し、サービスからIBinder.linkToDeath()を介してIBinderに登録します。何らかの理由でServiceが死亡し、アクティビティBが内部の書籍を正常にクリーンアップしてサービスに再バインドし、再バインドできる場合、/がコールバックされます。

関連する問題