从另一个Activity绑定到本地服务时出现ClassCastException

时间:2010-12-24 14:59:38

标签: android service local classcastexception

在我的应用程序中,我有两个独立的APK。来自第一个APK的活动(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)
  {

  }


 }

1 个答案:

答案 0 :(得分:0)

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


更新(回复评论):我没有看到使用界面会有什么不同;与类一样,接口将在客户端和服务器上以不同方式实例化,因此会导致强制转换异常。您可能可以使用reflection解决此问题,但我不建议采用这种方法 - AndroidOS或DalvikVM可能不支持此方法。

我认为最好的方法是尝试创建AIDL界面,看看它是否能完成这项工作。它可能比尝试做一些Android似乎故意设计的事情要容易一些。

但是如果你想继续追求当前的方法,一个可能的路径就是使用ClassLoader将客户端类加载到服务器中。我不确定是否可以这样做。