2011-11-09 13 views
3

これは、過去に同様の疑問に遭遇した人々に対するAndroidの内部構造に関する質問です。どのように私は、機能を要求して、発信者がまだあるかどうかを知ることができます -bindService、unbindService、android and non-sunny-day-scenarios

私は他のプロセスで実行中のアプリケーションに特定の機能を提供し、バインドサービスを持っていると仮定すると:

質問は、本質的には非常に簡単ですか?

hereのようなリモートコールバックを実装しているリモートサービスがあると仮定すると、コールバックを受け取るクラスがまだあることを確認するにはどうすればよいですか?クリーニングはどのように行われますか?開いているファイルやソケットで起きるように、アプリケーションが去ったりクラッシュしたりすると自動的に閉じられますか?

、最後に:私のサービスからアンバインドせずに

リモートアプリケーションがクラッシュした場合、そのサービスを使用して最後のアプリケーションであっても、実行し続けるのだろうか?

すべてのヒントのおかげで、みんな、ありがとう。

答えて

1

私はこれをテストしましたが、たとえ外部コンポーネントがServiceConnectionをリークしてもバインドに失敗しても、Androidはサービスを終了します(startServiceで開始されておらず、別の場所にバインドされていない場合)。この場合、onUnbindとonDestroyが呼び出されます。

コールバックを登録したコンポーネントがまだ生存しているかどうかを検出する限り、CommonsWareはコールバックを試すだけでよいと考えています。ただし、呼び出すコンポーネントを起動して起床することができるはずです。

コールバックに必要な動作の2種類の外部コンポーネントが死んでいる場合(通常のコールバックが失敗するように)があります

  1. は、外部コンポーネントが場合にのみ、あなたのサービスからのコールバックを受信する必要があります問題のコンポーネントはまだ生きています。この場合、デッドコールバックを呼び出すことによってスローされた例外をスワップ(およびログ)してください。
  2. サービスがコールバックしようとしたときに、もはや生きていない外部コンポーネントが起動するべきである(SHOULD)。通常のコールバックメソッドではこれを行うことができないので、デッドコンポーネントを起動するためにいくつかの意図を消しておく必要があります。これを行う簡単な方法は、コンポーネントがPendingIntentをサービスに登録するためのメソッドを提供することです。通常のコールバックが失敗した場合は、単にPendingIntentを起動します。外部コンポーネント(関連するインテントのレシーバとして登録する必要があります)は、起き上がり、失敗したコールバックの結果を取得するための追加のメソッドを再バインドして呼び出すことによって、インテントに適切に応答します。これは、呼び出し元が死ぬことを許可し、目を覚ますことが期待される場合、startService()を介してサービスを開始し、適切に停止する必要があります。そうしないと、実行中に収集される可能性があるからですPendingIntentを起動する前に要求された作業
+0

ありがとうございます。だから私は究極の方法は、時々私のリスナーを「ハートビート」し、単に例外を引き起こす人々を掃除することだと思います。それはネットワーキングにかなり似ています。 アンドロイド自体がデッドバインディングを削除することも知っておきましょう。これは興味のないときに実行中のプロセスがあるという問題をほとんどなくします。 –

+0

ハートビートIMOは不要です。そうするための答えの変更を見てください。 –

0

他のプロセスで実行されているアプリケーションに特定の機能を提供するバインドサービスがあると仮定すると、機能を要求している呼び出し元がまだ存在するかどうかを知ることができますか?

AFAIKはありません。

ここに記載されているように、リモートコールバックを実装するリモートサービスがあると仮定すると、コールバックを受信するクラスがまだあることを確認するにはどうすればよいですか?

コールバックオブジェクトが使用できなくなった場合(クライアントがなくなったなど)、RemoteObjectExceptionが返されます。

クリーニングはどのように実行されますか?

この文脈では、どういう意味か分かりません。

は、アプリケーションが切断されたときに自動的に閉じられます。つまり、開いているファイルやソケットではどうなりますか?

はい、サービスでこの事実は通知されませんが、

私のサービスからアンバインドせずにリモートアプリケーションがクラッシュした場合、サービスを使用している最後のアプリケーションであっても実行されますか?

わかりません。私はAndroidがこれを検出してサービスを停止することを願っていますが、私はこれを試していません。