これはメモリベースの IPC ( LocalService の例と同様) に関するものですが、同じプロセスで実行されている 2 つのアプリの場合です。
2 つのアプリ ( App1
、 ) と、両方のアプリのいくつかのインターフェイスと抽象クラスを定義App2
する共有プロジェクト ( ) があります。Shared
Shared (regular Java project, references android.jar)
- abstract myAbstractService
- Binder myBinder
App1 (Android Project, references Shared)
- MainActivity
App2 (Android Project, references Shared)
- myService extends myAbstractService
両方のアプリが同じプロセス (my.process
で定義されている<application>
)
内で実行され、 がApp2
発行されcom.www.app2.myService
ます。
<-- Both Apps run in the same process -->
<manifest <!-- *snip* --> android:sharedUserId="my.shareduser">
<!-- ... -->
<application <!-- *snip* --> android:process="my.process">
<-- App2 exports the service -->
<service android:name="com.www.app2.myService" android:exported="true">
<intent-filter>
<action android:name="com.www.app2.myService" />
</intent-filter>
</service>
これは要約ですmyAbstractService
(myService
まだ新しいものは何も追加していません):
abstract public class GameClient extends Service
{
private static final String LOGTAG = "GameClient";
private myBinder binder = new myBinder();
public IBinder onBind(Intent intent)
{
Log.d(LOGTAG, "onBind()");
return this.binder;
}
public class myBinder extends Binder
{
public void sendMessage()
{
Log.d(LOGTAG, "sendMessage()");
}
}
}
myService
(App1)から (App2)にバインドしようとするとMainActivity
:
public void onServiceConnected(ComponentName name, IBinder service)
{
Log.d("MS", service.getClass().toString());
main.this.t = (myBinder) service; // Exception in this line of course
}
例外があります:
DEBUG/MS(5464): クラス com.www.shared.myBinder
エラー/AndroidRuntime(5464): java.lang.ClassCastException: com.www.shared.myBinder
両方のアプリが同じプロセスで実行されるため、メモリ結合通信が機能するはずです (少なくとも私はそう思いました)。かなりの数のメッセージを送信するため、メッセージベースまたはブロードキャストベースの通信を使用したくありません。
同じクラスに 2 つの異なるクラスローダーが使用されているために、この例外が発生したのではないでしょうか? このアプローチは単に不可能/間違っているのでしょうか、それとも何か不足していますか?
更新:
私の目的は、App1 が他のモジュール (アプリ) の委任および開始アプリケーションとして使用される、非常にモジュール化されたアプリケーションを作成することです。App1
それに依存するすべてのアプリ を同梱したくないので、独自のアプリにしました。
3 番目のアプリ (App3、Android プロジェクト) があるとします。App2 と App3 は両方とも App1 によって開始されます (接続のセットアップを担当しますが、App2 と App3 は異なるアプリケーション ロジックを提供します (ただし、同じインターフェイスを持ちます))。
もう一度考えてみると、これはAndroidライブラリでも解決できると思います(App1とSharedがライブラリとしてマージされ、このライブラリのアクティビティを開始し、結果を待っています) App2
? App3
ただし、データは分割可能ではなく (ネットワーク接続)、このライブラリを Android マーケットで独立して配布する方法がわかりません (そこに公開されていますが、ライブラリもインストールするように依頼します) App2
。App3
これはその問題をまったく解決しますか?