何时将调用有线服务的onServiceConnected?

ET.*_*ET. 7 service android

我试图从这样的另一个服务绑定服务:

public class ServiceA extends Service {
    private ServiceB mDataService;
    private boolean mIsBound;

    @Override
    public void onCreate(){
        super.onCreate();
        doBindService();
        /* ... */
    }

    @Override
    public void onStart(final Intent intent, final int startId){
        /*...*/
    }

    private ServiceConnection mConnection = new ServiceConnection() {
        public void onServiceConnected(ComponentName className, IBinder service) {            
            mDataService = ((ServiceB.LocalBinder)service).getService();
        }
        public void onServiceDisconnected(ComponentName className) {             
            mDataService = null;
        }
    };

    void doBindService() {          
        bindService(new Intent(ServiceA.this, ServiceB.class), mConnection, Context.BIND_AUTO_CREATE);          
        mIsBound = true;
    }

    void doUnbindService() {
        if (mIsBound) {                     
            unbindService(mConnection);
            mIsBound = false;
        }
    }       
}
Run Code Online (Sandbox Code Playgroud)

这是我从goolge的示例中获取的一个简单片段:)代码工作正常,mDataService保存对ServiceB实例的引用,但有一件事我无法理解:在onServiceConnected调用之后调用回调onStart.正如我在android的文档中看到的那样,回调是在主线程上运行的 - 但是我可以指望它在我的情况下总是以这个顺序发生吗?onCreate - > onStart - > onServiceConnected?

yor*_*rkw 13

在官方开发指南中没有明确说明,Context.bindService()确实是一个异步调用,这也解释了为什么ServiceConnection.onServiceConnected()被实现为回调.查看开发指南:

客户端可以通过调用bindService()绑定到服务.如果是这样,它必须提供ServiceConnection的实现,它监视与服务的连接.bindService()方法立即返回而没有值,但是当Android系统在客户端和服务之间创建连接时,它调用ServiceConnection上的onServiceConnected(),以传递客户端可用于与服务通信的IBinder.

在正确建立与服务的连接之后,在将来的某个时刻(在调用Context.bindService()之后不立即)在UI线程上调用ServiceConnection.onServiceConnected().

  • 是的。并且应该在某处用大红色字母说明以下内容:**在等待服务连接时不要阻止活动/服务启动线程!**(好吧,永远不要阻止它,但在服务绑定的情况下,情况会更糟) (2认同)
  • -1,开发指南错了.`bindService()`确实返回一个值.来自http://developer.android.com/reference/android/content/Context.html,"如果您已成功绑定到该服务,则返回true;如果未建立连接,则返回false,因此您将不会收到服务对象." (2认同)

Dav*_*ser 2

我不会依赖它。这取决于 ServiceA 和 ServiceB 是在相同进程中还是在不同进程中运行。这可能还取决于 ServiceB 是否已经启动。您应该编写代码,以便不依赖于这一系列事件。