我对bindService()有意见。我试图在构造函数中进行绑定,提供一个包含两个可打包的附加组件的意图。构造函数在onResume()中被调用,而服务在其onBind()方法中解析这两个extra,并可能作为解析的结果返回null
当我第一次运行应用程序(通过在eclipse中运行)时,绑定(预期)被服务拒绝:调用服务的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”,“拒绝绑定”不再出现。
我怀疑这可能与安卓意识到有一个成功绑定的可能性有关,即使是在我强制拒绝的情况下。理想情况下,我也可以强制“解除绑定”,但这是不可能的:我怀疑这是因为,当我关闭应用程序时,我得到的日志位于服务的onUnbind()方法中(即使一开始不应该有绑定!)是的。

最佳答案

有同样的问题,但意识到我的服务实际上并没有启动。也许可以尝试将“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);

10-08 16:39