在不使用AIDL的情况下在同一“共享”过程中调用服务的方法

时间:2012-11-02 16:16:01

标签: android service android-activity ipc aidl

我正在尝试绑定一个活动的服务,并且可以调用它的方法。 这些是在不同的应用程序(apk),但使用相同的sharedUserId和进程。

由于他们使用相同的过程,我是否有义务使用AIDL,或者我可以像本地服务一样使用经典的IBinder(在Android Developer sample上描述)吗?

我试过了两个。 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,那就是让我的应用程序尽可能简单。

希望你能帮助我,抱歉我的英语不好; - )

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

您可以通过以下几种方式解决此问题:

1)正如您所注意到的,您可以使用AIDL。这是效率最低的机制,显然只限于AIDL兼容类型。

2)您可以使用Java反射API。就效率而言,这比AIDL更好,但当然语法并不是很好。

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