6

Android の 2 つの異なるプロセス (サービスとアクティビティ) 間の通信は、Messenger または AIDL を介して管理できます。アクティビティがサービスにバインドされていれば十分です。

しかし、このアクティビティに 1 つ以上のサブアクティビティがある場合はどうなるでしょうか。メイン アクティビティがサブ アクティビティを開始した瞬間から、通信をサブ アクティビティにリダイレクトしたいと考えています。同様に、サブアクティビティが破棄されたときに、通信がメインアクティビティにリダイレクトされることを希望します..

例 1:

  1. MyService <---IPC---> MainActivity
  2. MainActivity は SubActivity を起動し、次に MyService <---IPC---> SubActivity を起動します
  3. SubActivity が破棄され、MyService <---IPC---> MainActivity

例 2:

  1. MyService <---IPC---> MainActivity
  2. MainActivity が FirstSubActivity を起動し、次に MyService <---IPC---> FirstSubActivity を起動します
  3. FirstSubActivity が SecondSubActivity を起動し、次に MyService <---IPC---> SecondSubActivity を起動します
  4. SecondSubActivity が破棄され、MyService <---IPC---> FirstSubActivity
  5. FirstSubActivity が破棄され、次に MyService <---IPC---> MainActivity

これらのケースをどのように処理しますか?

4

2 に答える 2

5

サービスへのバインドと接続の保持を担当する単一のエンティティが必要であり、そのエンティティが Activity インスタンスである必要はありません。これを試して:

  • Activity をサブクラス化する基本クラス (BaseActivity) を作成する
  • BaseActivity からすべてのアクティビティを派生させます
  • BaseActivity のメソッドを使用して、アプリケーションとサービスの間の接続を管理します。BaseActivity には、サービスへの接続を追跡し、サービスへのバインディングを処理し、終了時にサービスをシャットダウンする静的 (クラス) 変数が必要です。
  • アクティビティが破棄されたときに OS がサービスへの接続を切断しないように、サービスにバインドするときは (アクティビティ コンテキストではなく) アプリケーション コンテキストを使用してください。

このようにして、さまざまなアクティビティとサービスの間の接続の作成と破棄について心配する必要はありません。アプリケーション全体 (すべてのアクティビティ) とサービスの間の接続は 1 つだけです。

面倒な詳細をすべて説明していないことは承知していますが、基本的な考え方を理解していただければ幸いです。

于 2012-05-09T16:05:59.847 に答える
1

次の解決策について考えたことはありますか?アクティビティをサービスにバインドする代わりに、コマンドstartService()を使用してアクティビティを開始してから、インテントおよびレシーバーと通信できます。このようにして、他のアクティビティを起動し、その状態についてサービスを呼び出し、必要な場所でサービスを操作できます:)

于 2012-05-07T17:16:05.057 に答える