当正好onServiceConnected为界服务将被调用?(When exactly onServ

2019-09-17 14:48发布

我想从这样的其他服务绑定服务:

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;
        }
    }       
}

这是一个简单的代码片段,我从GOOLGE的样品了:)代码工作得很好,mDataService持有至ServiceB实例的引用,但有一件事我不明白: onServiceConnected回调调用后调用onStart 。 正如我在Android上的文档看到, 回调主线程上运行 -但我能指望它,它总是会在我的情况下,这个顺序发生? 的onCreate - >在onStart - > onServiceConnected?

Answer 1:

如果官方开发指南(仍然)不明确,Context.bindService()确实是一个异步调用 。 这也解释了为什么ServiceConnection.onServiceConnected()作为回调来实现。

退房的开发者指南 :

客户端通过调用绑定到服务bindService() 当它,它必须提供一个实现ServiceConnection ,其监视与服务的连接。

的返回值bindService()指示所请求的服务是否存在以及客户端是否允许访问。

当Android系统会在客户端和服务之间的连接,它调用onServiceConnected()ServiceConnection 。 所述onServiceConnected()方法包括IBinder参数,其中,客户端随后使用与结合的服务进行通信。

ServiceConnection.onServiceConnected()在未来某个时间点上调用UI线程(调用后不立即Context.bindService()),一旦连接到服务是否正常建立。



Answer 2:

我不会依赖于它。 这取决于如果ServiceA和ServiceB在相同或不同的进程正在运行。 如果ServiceB已经开始这或许也要看情况。 你应该写你的代码,以便您不依赖于事件的顺序。



文章来源: When exactly onServiceConnected for bounded service will be called?