【发布时间】:2011-07-08 21:34:46
【问题描述】:
这是关于基于内存的 IPC(例如 LocalService 示例),但适用于在同一进程中运行的两个应用程序:
我有两个应用程序(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()");
}
}
}
当我尝试从我的 MainActivity (App1) 绑定到 myService (App2) 时:
public void onServiceConnected(ComponentName name, IBinder service)
{
Log.d("MS", service.getClass().toString());
main.this.t = (myBinder) service; // Exception in this line of course
}
我得到一个例外:
调试/MS(5464):com.www.shared.myBinder 类
错误/AndroidRuntime(5464): java.lang.ClassCastException: com.www.shared.myBinder
由于两个应用程序在同一个进程中运行,内存耦合通信应该可以工作(至少我认为)。我真的不想使用基于消息或基于广播的通信,因为我会发送相当多的消息。
我怀疑这个异常是由于同一个类使用了两个不同的类加载器而发生的?这种方法根本不可能/错误,还是我遗漏了什么?
更新:
我的目标是编写一个非常模块化的应用程序,其中 App1 用作其他模块(应用程序)的委托和启动应用程序。由于我不想将 App1 与每个依赖于它的应用程序一起发送,所以我把它做成了自己的应用程序。
假设我有第三个应用(App3,Android 项目)。 App2 & App3 均由 App1 启动(负责建立连接,而 App2 & App3 提供不同的应用逻辑(但具有相同的接口)。
再想一想,我认为这也可以通过 android 库来解决(App1 和 Shared 合并为库,App2 和 App3 启动该库的 Activity 并等待结果)?但是数据是不可打包的(网络连接),我不知道这个库如何在 android 市场上独立分布(比如 App2 和 App3 在那里发布,但也要求安装该库)。这能解决这个问题吗?
【问题讨论】:
标签: android android-service ipc android-binder