0

我在绑定服务时遇到问题:我使用以下代码:

protected void onCreate(){
    ...
    button.setOnClickListener(new OnClickListener(){
           @Override
            public void onClick(View v) {
                if(mService != null)
                               Log.e(TAG, "is instantiated (onClick)!");
            });
}

protected void onStart(){
   super.onStart();
   bindService(new Intent(this, HostService.class), connection, Context.BIND_AUTO_CREATE);
   if(mService == null)
      Log.e(TAG, "is null (onStart)!");
}
...

开始我的活动后“为空(onStart)!” 在 LogCat 中打印。当我点击按钮“被实例化(onClick)!” 被打印。为什么 bindService() 不直接实例化我的服务实例 mService ,我该如何解决参考这个问题?

谢谢和问候

4

1 回答 1

0

为什么 bindService() 不直接实例化我的服务实例 mService

bindService()是异步的,就像 Android 中的许多操作一样,所以它发生在您在 onStart 中测试之后。

我该如何解决与此相关的问题?

将您的业务逻辑放入您onServiceConnected()的, 而不是在通话ServiceConnection后立即进行。bindService()

以下是 ServiceConnection 代码的示例:

private ServiceConnection sConn;
private Messenger messenger;
...
@Override
protected void onCreate(Bundle savedInstanceState) {
    // Service Connection to handle system callbacks
    sConn = new ServiceConnection() {
         @Override
        public void onServiceDisconnected(ComponentName name) {
            messenger = null;
        }

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            // We are conntected to the service
            messenger = new Messenger(service);
        }
    };

    // We bind to the service
    bindService(new Intent(this, ConvertService.class), sConn,
            Context.BIND_AUTO_CREATE);
}

这是 Francesco Azzola 的一个很好的例子

于 2013-05-04T20:15:11.520 回答