其他分享
首页 > 其他分享> > android-从另一个活动绑定到本地服务时发生ClassCastException

android-从另一个活动绑定到本地服务时发生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)
  {

  }


 }

解决方法:

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

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

我认为最好的方法是尝试创建AIDL接口,看看它是否能完成工作.它可能比尝试执行Android故意阻止的操作要容易10倍.

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

标签:classcastexception,android,service,local
来源: https://codeday.me/bug/20191013/1909049.html