1

在我的应用程序中,我有两个单独的 APK。第一个 APK 的 Activity (A1) 启动本地服务,并能够调用该服务提供的方法。稍后活动 A1 从第二个 APK 启动另一个活动 (A2)。A2 活动尝试连接到由 A1 启动的本地服务。这两个活动都在具有相同 SharedUserID 的同一进程中运行。提供服务接口,如 LocalService 的 API 示例所示。服务的 onBind 方法返回具有方法 getService() 的 LocalBinder 实例。当调用 A2 的 onServiceConnected 时,当我尝试从 IBinder 转换为 MyService.LocalBinder 时,我得到了 ClassCastException。

在调试器中,我可以看到 A2 活动的 onServiceConnected 的服务参数是 MyService.LocalBinder 的正确实例。我什至可以在调试器中查看 MyService 的所有属性,但是当我尝试将 IBinder 服务强制转换为 MyService.LocalBinder 时,我得到了 ClassCastException 异常?有什么办法还是我必须使用 AIDL?

public void onServiceConnected(ComponentName className, IBinder service)
{

  try
  {
       MyService.LocalBinder binder = (MyService.LocalBinder)service;
       m_IService = binder.getService();
  }
  catch(ClassCastException e)
  {

  }


 }
4

1 回答 1

0

对此不确定,但我猜您已将 MyService.LocalBinder 编译到 A1 和 A2 apk 中。这会产生这种异常,因为虽然它们具有相同的名称和相同的代码,但它们仍然是两个独立的类文件。我认为您需要将该类移动到共享库中才能完成这项工作。


更新(回应评论):我看不出使用界面会有什么不同;与类一样,接口将在客户端和服务器上以不同方式实例化,因此会导致强制转换异常。您也许可以使用反射来解决这个问题,但我不推荐这种方法——AndroidOS 或 DalvikVM 可能都不支持它。

我认为最好的方法是尝试创建 AIDL 接口,看看它是否能完成这项工作。这可能比尝试做一些 Android 似乎有意阻止的事情要容易 10 倍。

但是,如果您想继续采用当前的方法,一种可能的途径是使用ClassLoader将客户端类加载到服务器中。我不确定这是否也可以工作。

于 2010-12-24T15:32:36.837 回答