我正在实现一个服务,并在该服务的顶部有一个包装类,该类在本地绑定到该服务。现在,当我将服务导出为jar并从另一个应用程序链接到它时(这个应用程序实例化包装类)。
当我运行应用程序时,我得到了classcastexception:android.os.binderproxy不能强制转换为xxx$localbinder
由包装类中的本地绑定引起:
service = ((LocalBinder) binder).getService();
这里的绑定器是binderproxy类型,而不是localbinder类型,因此导致崩溃。
这个应用程序工作的唯一方式是当应用程序的包名与服务包名相同时(我假设android认为服务是本地的)。
private final IBinder localBinder = new LocalBinder();
public class LocalBinder extends Binder {
xxxService getService() {
return xxxService.this;
}
}
和
public IBinder onBind( Intent intent ) {
IBinder result = null;
result = localbinder;
return result;
}
然后在我的包装类onServiceConnect中:
public void onServiceConnected( ComponentName name, IBinder binder) {
xxxService = ((LocalBinder) binder).getService();
最后,我的包装类构造函数:
public xxxServiceManager( Context context ) throws Exception {
this.context = context;
xxxServiceManagerIntent = new Intent( "providerAPI" );
xxxServiceManagerIntent.setClassName( "com.yyy", "com.yyy.xxxService" );
context.startService( xxxServiceManagerIntent );
context.bindService( xxxServiceManagerIntent, serviceConnection, Context.BIND_AUTO_CREATE );
然后在使用这个jar的主应用程序中,如果设置包名
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.yyy.provider" //the same as the service (which does not make sense)
一切正常,但显然我想设置另一个包名。
有什么方法可以重新设计或使之发挥作用吗?
谢谢!
最佳答案
见this
如果您的服务仅由本地应用程序使用,并且不需要跨进程工作,那么您可以实现自己的绑定器类,该类为您的客户机提供对服务中的公共方法的直接访问。
注意:只有当客户机和服务在同一个
应用程序和过程,这是最常见的。例如,这将
对于需要将活动绑定到
它自己的服务是在后台播放音乐。