8

次のような別のサービスからサービスをバインドしようとしています:

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 インスタンスへの参照を保持していますが、理解できないことが 1 つありonServiceConnectedますonStart。Androidのドキュメントで見たように、コールバックはメインスレッドで実行されていますが、私の場合は常にこの順序で発生すると期待できますか? onCreate -> onStart -> onServiceConnected ?

4

2 に答える 2

13

公式の開発ガイドが (まだ) 明確でない場合、 Context.bindService() は確かに非同期呼び出しです。ServiceConnection.onServiceConnected()これは、 がコールバックとして実装されている理由も説明しています。

開発ガイドをチェックしてください:

クライアントは、 を呼び出してサービスにバインドしますbindService()ServiceConnectionその場合、サービスとの接続を監視するの実装を提供する必要があります。

の戻り値はbindService()、要求されたサービスが存在するかどうか、およびクライアントがそのサービスへのアクセスを許可されているかどうかを示します。

Android システムは、クライアントとサービス間の接続を作成するときonServiceConnected()に、ServiceConnection. onServiceConnected()メソッドには引数が含まれており、クライアントはこのIBinder引数を使用してバインドされたサービスと通信します。

ServiceConnection.onServiceConnected()サービスへの接続が適切に確立されると、将来のある時点で (Context.bindService() を呼び出した直後ではなく) UI スレッドで呼び出されます。

于 2012-05-29T22:00:26.937 に答える
2

私はそれに頼りません。ServiceA と ServiceB が同じプロセスで実行されているか、異なるプロセスで実行されているかによって異なります。おそらく ServiceB がすでに開始されているかどうかにも依存します。この一連のイベントに依存しないようにコードを記述する必要があります。

于 2012-05-29T16:05:48.820 に答える