2012-03-13 5 views
0

Androidサービスの記事「Binderクラスを拡張する」http://developer.android.com/guide/topics/fundamentals/bound-services.htmlで提供されているサンプルローカルサービスプロジェクトを作成しました。Androidローカルサービスバインドの問題

すべて正常です。ただし、クエリは

です。unbind()を使用すると、サービスは停止しません。もしunbind()が行うよりも、yesなら明示的にstopSelf()を使う必要があります。

私は、次の3つのボタンでサンプルプロジェクトを作成している - >へ - サービスに

スタートをバインド解除する> - サービス

停止をバインドする> - >停止し、起動して

スタートをフェッチサービスのアクセス方法。 (乱数生成法)

は、今までのアクセス:

  1. 開始 - サービス

  2. 停止の方法へのアクセス権を取得します - - サービスをアンバインド

  3. フェッチサービスをバインド

ここで私はそのサービスを除きますアンバインドして破壊する。しかし、

ステップ4:フェッチする - このメソッドはまだ動作し、予想通りに乱数を生成しますが、何らかの例外がありました。あなたがバインドサービスが別のプロセスである - - リモートサービスについては

+0

[この質問と回答](http://stackoverflow.com/questions/2176375/android-service-wont-stop)はあなたが探しているもののようです。 – Fishbreath

+0

"unbind()を使用すると、サービスは停止しません。" - どうやってこれを決めましたか? 「停止した」とはどういう意味ですか? – CommonsWare

+0

@ CommonSWare:分かりやすくするために私の質問を編集しました。 – Ravibhushan

答えて

1

上のメソッドを呼び出そうと:

(それだけでクラッシュした場合に呼び出されますので、onServiceDisconnectedが呼び出されることはありません)バインド解除後のバインダープロキシはRemoteExceptionになります。

ローカルサービス(サービスがまだ処理されている)の場合、バインド解除後にバインダーでメソッドを呼び出そうとすると、引き続き動作する可能性があります。この場合のバインダーは、サービスがonBind()を介して返したものとまったく同じオブジェクトです。ガベージコレクションルールでは、バインダーを持っていればバインダーをガベージコレクションできないことが記載されています。

ただし、バインド解除後にバインダーのメソッドを呼び出すのは危険で貧弱なフォームです。 サービスはそれが破壊されたと思います。あなたのバインダーが、サービスがonDestroy()でクリーンアップされていることに依存するものがあれば、でクラッシュする可能性があります。同様に、バインダーのガベージコレクションを許可するまで、サービスのメモリがリークしています。

ところで、私はあなたのサービスが「乱数を生成する」より意味のある何かをしてくれることを願っています。あなたはそのためのサービスは必要ありません。

+0

貴重な情報をありがとう。乱数生成について:私の質問ですでに述べた通りです。それはサービスを勉強するためのサンプルプロジェクトです。 – Ravibhushan