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

2024-02-28

在我的应用程序中,我有两个独立的 APK。第一个 APK 中的 Activity (A1) 启动本地服务并能够调用该服务提供的方法。随后,活动 A1 从第二个 APK 启动另一个活动 (A2)。 A2 活动尝试连接到 A1 启动的本地服务。两个活动都在具有相同 SharedUserID 的同一进程中运行。提供的服务接口如LocalService的API示例所示。服务的 onBind 方法返回 LocalBinder 实例,该实例具有 getService() 方法。 当调用 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 中。这会产生这种异常,因为虽然它们具有相同的名称和相同的代码,但它们仍然是两个单独的类文件。我认为您需要将类移至共享库才能完成这项工作。


Update(回应评论):我不知道使用界面有什么不同;与类一样,接口在客户端和服务器上的实例化方式不同,因此会导致强制转换异常。你也许可以使用反射 http://download.oracle.com/javase/tutorial/reflect/index.html解决这个问题,但我不推荐这种方法——它可能不受 AndroidOS 或 DalvikVM 的支持。

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

但如果你想继续采用目前的方法,一possible路径是使用类加载器 http://developer.android.com/reference/java/lang/ClassLoader.html将客户端类加载到服务器中。我也不确定这是否可以发挥作用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从另一个 Activity 绑定到本地服务时出现 ClassCastException 的相关文章

随机推荐