gpt4 book ai didi

android - 来自其他应用程序但相同用户标识/进程的 bindService

转载 作者:行者123 更新时间:2023-11-29 15:31:06 26 4
gpt4 key购买 nike

这是关于基于内存的 IPC(如 LocalService 示例)但对于在同一进程中运行的两个应用程序:

我有两个应用程序(App1App2)和一个共享项目(Shared),它为两个应用程序定义了一些接口(interface)和抽象类:

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()");
}
}
}

当我尝试绑定(bind)到 myService 时(App2) 来 self 的 MainActivity (应用程序 1):

public void onServiceConnected(ComponentName name, IBinder service) 
{
Log.d("MS", service.getClass().toString());
main.this.t = (myBinder) service; // Exception in this line of course
}

我得到一个异常(exception):

DEBUG/MS(5464): class com.www.shared.myBinder
ERROR/AndroidRuntime(5464): java.lang.ClassCastException: com.www.shared.myBinder

由于两个应用程序在同一个进程中运行,内存耦合通信应该可以工作(至少我认为是这样)。我真的不想使用基于消息或基于广播的通信,因为我会发送很多消息。
我怀疑这个异常是由于两个不同的类加载器被用于同一个类而发生的?这种方法根本不可能/错误还是我遗漏了什么?

更新:
我的目标是编写一个非常模块化的应用程序,其中 App1 用作其他模块 (apps) 的委托(delegate)和启动应用程序。因为我不想发货 App1每个应用程序都依赖它,我让它成为自己的应用程序。

假设我有第三个应用程序(App3,Android 项目)。 App2 & App3 均由 App1 启动(负责建立连接,而 App2 & App3 提供不同的应用逻辑(但具有相同的接口(interface))。

再想一想,我认为这也可以通过 android 库来解决(App1 和 Shared 与 App2App3 合并为库,启动该库的 Activity 并等待结果)?然而,数据是不可分割的(网络连接),我不知道这个库如何在 android 市场上独立分发(比如 App2App3 在那里发布,但要求也安装该库)。这会完全解决这个问题吗?

最佳答案

你是对的,你收到这个异常是因为涉及到两个类加载器。

我添加了接下来的两行代码:

@Override
public void onServiceConnected(ComponentName name, IBinder service)
{
...
Log.e(TAG, "Expected class loader: "+myBinder.class.getClass().getClassLoader());
Log.e(TAG, "Class loader: "+service.getClass().getClassLoader());
...
}

并收到这些日志:

Expected class loader: java.lang.BootClassLoader@4001bdb0
Class loader: dalvik.system.PathClassLoader[/data/app/com.inazaruk.shared.service-2.apk]

从日志中可以清楚地看出使用了另一个类加载器。这实际上是有道理的,因为您可以在一周后使用不同版本的 myBinder 类(或通过 myBinder< 传递的任何其他类)安装 App1 应用程序 接口(interface)直接或间接)。



已更新:
在您的场景中,您应该坚持使用 Android 库。请注意,Android 库直接嵌入到引用它们的应用程序中。它们不单独分发。 Here is my post解释 Android 库与简单的 jar 有何不同,以及其他相关的细微差别。

Android 库中仍然具有高度模块化,因为最终的 Android 应用程序仅包含它使用的模块。但这是编译时模块化,而不是运行时模块化。

虽然 Android 库存在一些问题:

  1. 您需要将库的 AndroidManifest.xml 中的所有组件声明复制到 Android 应用程序的 AndroidManifest.xml 中。
  2. 目前库不支持自定义 xml 属性(请参阅我的帖子 herehere)。
  3. 目前图书馆不支持 Assets (请参阅我的帖子 here)。

#1 计划很快修复(根据 Build Support roadmap )。 #2 和 #3 可能会在下一版本的 SDK 平台工具中得到修复。

关于android - 来自其他应用程序但相同用户标识/进程的 bindService,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6630775/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com