Android bindService无法正常工作

时间:2012-11-07 15:56:19

标签: android service bind aidl

我遇到了bindService()的问题。我正在尝试在构造函数中进行绑定,提供包含两个parcleable附加组件的Intent。构造函数在onResume()中调用,服务在其onBind()方法中解析两个额外内容,并且可能会因解析而返回null

当我第一次运行应用程序时(通过Eclipse中的Run),服务拒绝(预期)绑定:调用服务的onBind()方法并返回null。但是,应用程序端的bindService()方法返回true(它不应该,因为绑定没有通过!)。

当我尝试以下操作时会出现更多问题:我按下HOME按钮并再次启动应用程序(因此其onResume()再次运行,应用程序再次尝试绑定到服务)。这次服务onBind()似乎甚至没有运行!但该应用的bindService()仍会返回true

以下是一些示例代码,可帮助您了解我的问题。

申请方:

// activity's onResume()
@Override
public void onResume() {
    super.onResume();
    var = new Constructor(this);
}

// the constructor
public Constructor(Context context) {
    final Intent bindIntent = new Intent("test");

    bindIntent.putExtra("extra1",extra_A);
    bindIntent.putExtra("extra2",extra_B);

    isBound = context.bindService(bindIntent, connection, Context.BIND_ADJUST_WITH_ACTIVITY);

    log("tried to bind... isBound="+isBound);
}

服务方:

private MyAIDLService service = null;   

@Override
public void onCreate() {
    service = new MyAIDLService(getContentResolver());
}

@Override
public IBinder onBind(final Intent intent) {
    log("onBind() called");     

    if (intent.getAction().equals("test") {
        ExtraObj extra_A = intent.getParcelableExtra("extra1");
        ExtraObj extra_B = intent.getParcelableExtra("extra2");

        if (parse(extra_A,extra_B))
            return service;
        else {
            log("rejected binding");
            return null;
        }

     }
}

我正在使用的ServiceConnection包含以下onServiceConnected()方法:

@Override
public void onServiceConnected(final ComponentName name, final IBinder service) {
    log("onServiceConnected(): successfully connected to the service!");

    this.service = MyAIDLService.asInterface(service);
}

所以,我从来没有看到“成功连接到服务!”登录。我第一次运行应用程序(通过Eclipse)我得到“被拒绝的绑定”日志以及“isBound = true”,但从那里我只得到“isBound = true”,“被拒绝的绑定”没有再来一次。

我怀疑这可能与Android的可能性有关,即使在我强制拒绝的情况下也能识别成功绑定。理想情况下,我也可以强制“解除绑定”,但这是不可能的:我怀疑这是因为,当我杀死应用程序时,我得到一个位于服务的onUnbind()方法中的日志(即使首先应该没有约束力!)。

1 个答案:

答案 0 :(得分:4)

有同样的问题,但意识到我的服务实际上并未启动。也许尝试添加" Context.BIND_AUTO_CREATE"到标志,这将导致创建和启动服务。我不相信Context.BIND_ADJUST_WITH_ACTIVITY会启动它,因此可能不会调用onServiceConnected(即使bindService()调用返回true,它也不适合我):

    isBound = context.bindService(bindIntent, connection,
          Context.BIND_ADJUST_WITH_ACTIVITY | Context.BIND_AUTO_CREATE);