1

我正在尝试从活动绑定服务并获得调用它的方法的可能性。它们在不同的应用程序 (apk) 中,但使用相同的 sharedUserId 和进程。

由于他们使用相同的流程,我是否必须使用 AIDL 或者我可以使用经典的 IBinder,例如本地服务(在Android 开发人员示例中描述)?

我都试过了。AIDL 工作正常,本地服务的方法不起作用,我有一个 ClassCastException :

E/AndroidRuntime(17511): java.lang.ClassCastException: com.example.app.MyService$LocalBinder cannot be cast to com.example.app.MyService$LocalBinder

是否可以使用这种方法在一个共同的“共享”进程中使用两个应用程序调用服务?还是说这个共享进程的使用还是需要像AIDL这样的IPC方式?

如果我想使用经典的 IBinder,这是为了让我的应用程序尽可能简单。

希望你能帮助我,并为我糟糕的英语感到抱歉;-)

4

2 回答 2

0

您的问题是每个应用程序都有自己的 APK,其中包含自己的 CLASSES.DEX,并且它们之间不共享类和接口。App1.apk/com.example.Class1被视为与 不同的类型App2.apk/com.example.Class1。它们是否相同并不重要。

有几种方法可以解决这个问题:

1) 如您所见,您可以使用 AIDL。这是效率最低的机制,并且显然将您限制为仅与 AIDL 兼容的类型。

2)您可以使用Java反射API。这在效率方面比 AIDL 好,但语法当然不是那么好。

3)您可以尝试使用自定义类加载以某种方式对其进行修改,以便两个应用程序都可以访问相同的类型。对于您正在尝试做的事情,这将比它的价值更麻烦。

于 2014-08-09T23:27:21.760 回答
0

我想问题如下。即使您使用 sharedUserId 并且您的应用程序在同一进程中运行,您也无法在本地调用服务的方法,因为您的服务和应用程序位于不同的包中。因此,您只能使用将在您的客户端应用程序中创建代理的 AIDL。

于 2012-11-02T16:23:41.413 回答