7

インスタンス間だけでなく、Androidのアプリケーション間で通信する方法を理解しようとしていActivityます。

メッセンジャーobjをサービスに送信する「クライアント」を設定しました(サービスにIntent送信されます)。サービスはMessageobjを作成し、を使用して「クライアント」に送り返しますmessenger.send(message)。これは、Message.objを使用してオブジェクトを保持しようとするまでは正常に機能します。

サービスで独自のParcelableクラスを作成MyParcelableし、メッセージに入れました。メッセージが「クライアント」でマーシャリングされなくなるまで、すべてが機能します。'client'にはMyParcelableクラスへのアクセス権がないため、アンマーシャルは失敗します。それは明らかです-それらは異なるパッケージにあります(たとえばcom.whatever.myclientcom.whatever.myserver)。これは完全に間違った方法ですか?

また、を作成しParcelて送信しようとしました(これにより、両方のアプリケーションがクラスにアクセスできるようになります)が、ParcelそうではありませんParcelable。使用されているクラスローダーについて読んだことがありますが、別々のアプリケーションで別々のクラスローダーがどのように使用されているかを理解していません(その点でAndroidアーキテクチャを理解している場合はプロセス)。つまり、一方のクラスローダーに、もう一方のクラスローダーに存在するクラスについて「教える」にはどうすればよいでしょうか。確かに「これがあなたのやり方です」というのは明らかなはずですが、私はまだそれを見ていません。

4

3 に答える 3

3

このクラスの知識がないプロセスでクラスをアンマーシャリングすることはできません(すでに正しく指摘しているように)。MyParcelableに送信する場合は、ビルドService含める必要があります。また、アンマーシャリングはシステムスレッドによって行われるため、アンマーシャリング時に使用する権利を含める必要があります。システムスレッドは、それを含めても何であるかを認識しません。コンパイル時。MyParcelableServiceClassLoaderMyParcelable

編集

(a)MyParcelableを2つの異なるパッケージに含め、それらを同じクラスとして表示する

共通クラスのライブラリを作成し、それを両方のアプリケーション(アプリケーションとService)に含めます。Androidライブラリとしてマークするか(EclipseではプロジェクトのAndroidプロパティのすぐ下にあります)、JARとしてエクスポートして両方のアプリにインポートできます。アプリに直接配置するのではなく、ライブラリに独立したクラスを配置することをお勧めします。このようにして、他のプロジェクトでそれらを再利用できます;)

(2)適切なClassLoaderを含めます(たとえば、適切なクラスローダーはどこから入手できますか)

ClassLoaderコードを実行しているときに、現在のスレッドから取得できます。明らかに、これClassLoaderはコードを実行しているため、クラスについて認識しています;)たとえば、Activity#onCreate()では、を実行できますThread.currentThread.getContextClassLoader()MyParcelableクラスもに含まれているのでService、同じことを行って有効なClassLoaderアンマーシャルを取得できます。

IPCのもう1つの解決策は、AIDLインターフェイスを定義して、を実装する必要がないようにすることですParcelable

于 2013-03-25T02:43:31.550 に答える
1

どこかで永続層を使用したくない場合(私はクラウドAPIを使用します)、別のプロセスでサービスを実行し、共有値ホルダータイプのオブジェクトデータを必要とするそれぞれのアプリをサービスにバインドできます。このサービスは、接続(バインド)アプリに代わってobj値を作成および取得する場所になります。

于 2013-03-25T02:58:07.430 に答える
1

OK、探していた「簡単な方法」を見つけました。バンドルをMessage.objフィールドに入れることができます。バンドルはパーセル可能であるため、クライアントとサーバー間で転送できます。BundleがAndroidJavaに組み込まれているため、サーバーが受信しているクラスを認識していないという問題はありません。また、バンドルにはinを含む「サブバンドル」を含めることができます。これは、両方の当事者がユーザー定義クラスの定義を知っていることを確認する必要がある場合よりも簡単です。上記の回答をありがとう-私は確かに情報に感謝します!

于 2013-03-28T03:44:19.130 に答える