私は、AIDL経由でRPCインターフェイスをエクスポートするAndroidサービスを提供しています。インターフェイスは接続指向です。クライアントは接続指向で接続し、処理してから終了します。残念ながら、クライアントは異常終了します。たとえば、次のようになります。システムによって殺されると、RPCインターフェイスに接続が終了したことを通知する機会は決してありません。これは問題を引き起こしています。クライアントがアタッチしてAndroidサービスに接続したときに通知を受ける
新しいクライアントがインターフェイスから自動的に接続および切断されると、サービスに自動的に通知される方法はありますか。私はonBind()
とonUnbind()
を見つけましたが、それらは同じものではありません。インターフェイスが使用されているかどうかを教えてくれます。 onUnbind()
は、最後のクライアントが切り離されたときにのみ呼び出されます。
アイデア?私は完全にほとんど正確に何をしている、linkToDeath()
で私が見てきたことを言及するのを忘れ:
アップデート(とサービスの設計は...外部要件によって制御され、変更することはできません)私は望みますが、それは正反対の方法でしか動作しないように思われます。サービスが終了したときにクライアントに通知することができます。私はそれを試したときに何も起こらなかったようだ。ドキュメントはちょっと変だ。誰もがこれが私の望むように動作するかどうかを知っていますか?もしそうなら、どうすればになるのですか?クライアントが死亡しましたか?
更新プログラムのアップデート:私はこの問題を解決しましたが、不正行為によってのみ解決しました。私はそれを再定義した。私のアプリは実際にNDKを使ってC言語で書かれているので、サービスのデザインが奇妙です。ですから、問題をCの世界に移し、Unixドメインソケットを使ってアプリケーションのネイティブ部分に直接話す小さなヘルパープロセスを作成しました。それは速く、非常に小さく、そしてほとんど防弾ですが、それはまだまだ不正です。だから私の問題は今解決されているが、私はまだ実際の答えが何であるか知りたい。
変更することはできませんが、既存のメソッドを変更しない限り、エクスポートされたインターフェイスにメソッドを追加することは許されますか?あるいは、サービスが外部から放送受信機を介して受信できる放送を送信させることができますか? – NickT
私が好きなインターフェイスはすべて変更できますが、全体的な接続指向アーキテクチャーはそのまま残っていなければなりません。私はサービスがクライアントが返信しなければならない放送を継続的に送信させることができ、返信しないクライアントは死亡したと仮定しますが、... ew。それはあなたが意味することですか? (ねえ、うまくいけば試してみるよ) –