0

アンドロイドに不慣れな開発者として、私はおそらくバインドされたサービスを誤解したと思います。

サーバーへのアクセスをまとめるサービスを作成しました。このサービスの一部として、サービスはマルチキャストアドレスをリッスンして、ローカルネットワーク上のデバイスがいつ表示および非表示になるかを識別します。

ただし、サービスのインスタンスが複数開始されているため、問題が発生しています。これは、アクティビティが閉じられ(戻るボタンを使用)、その後すぐに再開された場合に発生します。その結果、サービスはローカルポートにバインドできないため、マルチキャストをリッスンできなくなります。

アクティビティが停止すると、バインドされたサービスは終了すると思っていましたが、そうではないようです。

バインドされたサービスを誤解しましたか、それとも何か間違ったことをしていますか?

編集

したがって、私の誤解は、デーモン以外の最後のスレッドが閉じられるとすぐにプログラムがクリーンアップされ、アクティビティが終了するとすぐにプログラムがクリーンアップされると想定していたことです。

リスニングスレッドを明示的にキャンセルし、のソケットを閉じることで、これを修正しましたonDestroy()

4

2 に答える 2

1

ただし、サービスの複数のインスタンスが開始されているため、問題が発生しています

プロセスで実行されている特定のサービスクラスのインスタンスは、常にゼロまたは1つだけです。

アクティビティが停止すると、バインドされたサービスは終了すると思っていましたが、そうではないようです。

サービスは、次のいずれかの後に破棄されます。

  • bindService()に対応するすべての呼び出しunbindService()、および
  • startService()この実行中のサービスインスタンスを呼び出した場合は、電話をかけるstopService()か、サービスを呼び出しますstopSelf()

サービスが破棄される正確なタイミングは不確定ですが、通常、私が見たものからはかなり速いです。ただし、2番目のアクティビティインスタンスが破棄される前にサービスにバインドされ、それによってサービスが破棄されないようにする可能性を排除することはできません。

または私は何か他のことを間違っていますか?

おそらく、サービスが破棄されているときにマルチキャストソケットを適切にクリーンアップしていないか、以前のバインディングからすでに開いているときにソケットを開こうとしている可能性があります。

ここでバインディングパターンを使用している理由は完全にはわかりません。個人的には、通常、それが価値があるよりも厄介だと思います。おそらく、コマンドパターンを使用し、またはを介してサービスにコマンドを送信し、またはstartService()を介してサービスを停止することを検討してください。stopService()stopSelf()

于 2013-03-25T19:25:58.233 に答える
0

onbackpressed()でStopservice()を使用してみてください

于 2013-03-25T19:12:22.457 に答える