0

今日、Android 用サービスを使用すると、「非論理的」または「正しくない」、私の意見では、作業方法に直面しましたbindService。私があなたの内にあるアプリケーション サービスで作成した混乱の本質はExecutorService、要求を行います。私がアプリケーションに行ったとき、サービスは生きたままでした - クエリは特定の周期で別々のスレッドで実行されます (ログはこれを確認します)。メソッド onStart() で、すべてのマニュアルとチュートリアルで、このアプリケーションで以前に実行したサービスにアクセスできるようにするコードを書きました。しかし、私たちのすべてのアドバイスは明らかでした。私はその呼び出しを期待していましたbindService()-> 実行中のサービスに接続できます。しかし、いいえ、代わりに、最初の試行で接続が行われません-理由がわかりません. 以前に実行されていない場合は、サービス自体を実行するコードを追加しました。したがって、コードのこの部分がアクティブになり、サービスを実行しているだけに接続しようとします。そして、はい、接続は成功しましたが、最初の接続試行から得られると期待していたサービスに接続が栄養を与えます。また、サービスを再作成しようとしたログから判断すると、サービスの作成にはつながりません。これはすべてログから得られます。そして、これに関して、私は疑問に思います-なぜそれを接続する最初の試みが起こらないのですか? それとも私は間違っていますか?

アクティビティのフラグメント コード

...
private ServiceConnection serviceConnection = new ServiceConnection(){
        public void onServiceConnected(ComponentName name, IBinder service) {
            flagServiceConnection = true;
            Log.d("StartActivity/serviceConnection", "serviceConnection/onServiceConnected() -> connected");
            exService = ((ExService.ExBinder) service).getService();
            exService.setFlagBroadcast(true);
            exService.getAll();
        }

        public void onServiceDisconnected(ComponentName name) {
            flagServiceConnection = false;
            Log.d("StartActivity/serviceConnection", "serviceConnection/onServiceDisconnected() -> disconnected");
        }       
    };
...
public void onStart(){
        super.onStart();        
        bindService(new Intent(this.getApplicationContext(), ExService.class), serviceConnection, 0);       
        if(!flagServiceConnection){
            Log.d("StartActivity", "onStart() -> start service");
            this.startService(new Intent(this.getApplicationContext(), ExService.class));
            bindService(new Intent(this.getApplicationContext(), ExService.class), serviceConnection, 0);           
        }       
    }

ログ

D/StartActivity(5922): onCreate()
D/StartActivity(5922): onStart() -> start service
D/StartActivity/serviceConnection(5922): erviceConnection/onServiceConnected() -> connected
D/-(5922): pront.android.exservice.ExService$Monitor@4056b4c8
D/-(5922): pront.android.exservice.ExService$Monitor@405480e0
D/-(5922): pront.android.exservice.ExService$Monitor@4054ee18
D/ExService(5922): onRebind()
D/ExService(5922): onStartCommand() -> service start
4

1 に答える 1

0

最初の接続試行は機能しますが、flagServiceConnectionチェックは機能しないため、常にもう一度接続を試みます。その理由は次のとおりです。

メソッドを呼び出しbindService()てもすぐにはサービスに接続されないため、flagServiceConnection確認しようとするとまだ設定されていません。

あなたのチェックの目的は、サービスがまだ開始されていない場合、バインドする前にサービスを開始することだと思います。bindService()これを実現するには、BIND_AUTO_CREATEフラグを付けて呼び出す必要があります。

@Override
public void onStart(){
    super.onStart();        
    bindService(new Intent(this.getApplicationContext(), ExService.class), serviceConnection, BIND_AUTO_CREATE);       
    //that's it, if service is not started, it will be started automatically 
    //no need for additional checks         
    }       
}
于 2013-01-17T19:19:10.090 に答える