5

私はAndroid1 年以上前から使用していますが、プロセス/スレッド間のさまざまな種類のメッセージング/通信をいつ使用する必要があるかを判断するのにまだ苦労しています。主に、インテントのブロードキャスト、AIDL forservicesの使用、ハンドラーを使用したメッセージの送信、およびソケット通信について話しています。

これらのツールの多くは同様のタスクを実行するために使用できますが、特定の状況により適しているのはどれでしょうか?

4

4 に答える 4

16

これは自由回答形式の質問ですが、アプリケーション内/アプリケーション間通信がどのように最適に機能するかについて説明させてください。

Android メッセージングの重要な側面の 1 つは、すべてのアプリケーション コンポーネントが緩やかにバインドされているという概念です。すべてのアプリケーションは個別のプロセスで実行され、1 つの「アプリ」は実際には複数のアプリケーション (さまざまなアクティビティまたはサービスの提供を担当) で構成される場合があるため、メッセージング技術はすべて、プロセス境界を越えてメッセージをマーシャリングするという考えに基づいています。

インテント

メッセージングに推奨される手法であり、可能な限り常にインテントを使用するようにしてください。これは、Android 内でメッセージを転送する最も「ネイティブな」方法です。

利点

メッセージングにインテントを使用すると、アプリケーション コンポーネントの緩やかなバインディングが維持されるため、複数のアプリケーション間でメッセージをシームレスに転送できます。インテントは、アクティビティとサービスを開始し、システム イベントをブロードキャストおよび受信するために、コア システム内で頻繁に使用されます。

エクストラ バンドルを使用すると、プリミティブのキーと値のペアをペイロード データとしてインテント内に含めることができ、アプリケーション コンポーネント間で情報を簡単に渡すことができます。それらのコンポーネントが異なるプロセスで実行されている場合でも同様です。

短所

インテントはプロセス間を移動するように設計されているため、エクストラ ペイロードはプリミティブ型のみをサポートします。Intent を使用してオブジェクトを送信する必要がある場合は、一方の端でオブジェクトをプリミティブに分解し、もう一方の端で再構築する必要があります。

アプリケーション クラス

単一のプロセスで実行されている単一のアプリケーション内でのみ通信したい場合、これは便利なソリューションです。

利点

クラスを拡張Application(およびシングルトンとして実装) することで、アプリケーション コンポーネントのいずれかが存在するときはいつでも存在するオブジェクトを取得し、アプリケーション コンポーネント間で複雑なオブジェクト データを格納および転送するための一元化された場所を提供します。

短所

この手法では、メッセージングを 1 つのアプリケーション内のコンポーネントに制限します。

サービス バインディング、IPC、および AIDL

サービスにバインドすると、そのメソッドにアクセスしてオブジェクトを交換できます。AIDL は、オブジェクトを OS プリミティブにシリアル化する方法を定義する方法です。これにより、バインド先のサービスが別のアプリケーションで実行されている場合に、プロセスの境界を越えてマーシャリングできるようになります。

利点

サービスにバインドすると、呼び出し元のクラス内のオブジェクトであるかのようにサービスにアクセスできます。つまり、Service でメソッドを実行し、リッチ オブジェクトを交換できるということです。

別のアプリケーション プロセスで Service にバインドする場合は、アプリケーション間で渡したいオブジェクトをシリアライズ/デシリアライズする方法を Android に指示する AIDL 定義を作成する必要があることに注意してください。

短所

IPC 用の AIDL クラスを作成するのは少し余分な作業であり、バインドによってサービスとアクティビティの間に追加の依存関係が作成されるため、他のアプリケーションが不足しているときにカーネルがリソースをクリーンアップするのが難しくなる可能性があります。

ただし、プロセスの境界を越えてメッセージをマーシェリングするのはコストがかかります。したがって、サービスでメソッドを実行していない場合、バインディングと IPC を使用するのはおそらくやり過ぎです。インテントを使用して同じことを達成できるかどうかを確認してください。

ソケット

単一のデバイスで実行されているアプリケーション内またはアプリケーション間で通信するためにソケットに頼っている場合、それは他に方法がないか、どこかでトリックを見逃しているためです。メッセージがデバイスから送信される場合、ソケットは適切で高速な代替手段です。デバイスにとどまっている場合は、Intents または IPC がより適切なオプションになる可能性があります。

于 2009-06-03T21:44:17.277 に答える
2

それはすべて、ユースケースとアプリケーションの種類によって異なります。アプリケーションが常に実行されている場合は、最も安全な通信方法である AIDL アプローチを使用することをお勧めします。アプリケーションを常に実行する必要がない場合は、ブロードキャスト インテントまたは保留中のインテント アプローチを使用して、アプリケーション間で通信できます。

于 2015-06-09T14:36:14.180 に答える
1

私の2セント

  • 私はローカルソケットを使用していません。データを生成して解析する必要があるため、やり過ぎのようです。
  • インテントは、他のアプリがやりたいこと (作成ウィンドウで起動するか、何かを選択する) のためのものです。
  • 常に実行されているヘッドレス プロセスと GUI が対話するための AIDL/Parcels/Handlers。アプリによっては、実際のデータ転送の多くがコンテンツ プロバイダーを使用して行われる場合がありますが、そのチャネルの外に転送する必要があるデータがいくつかある傾向があります。
于 2009-05-29T18:05:35.667 に答える
0

これは、Cocoa の NSUserDefaults クラスの代替品を探すのに役立つ、良い記事です。

http://developer.android.com/guide/appendix/faq/framework.html

于 2010-10-16T01:34:33.200 に答える