web-dev-qa-db-ja.com

フォアグラウンドサービスと通信するandroid

ここで最初の質問ですが、私はしばらく前から出回っています。

私は何を持っていますか:

オーディオストリームとオンラインプレイリストを再生するAndroidアプリを作成しています。現在はすべて正常に機能していますが、サービスとの通信に問題があります。

音楽はstartForegroundで開始されたサービスで再生されているため、強制終了されません。

トラック名、画像、その他いくつかのものを取得するために、自分のアクティビティからサービスと通信する必要があります。

私の問題は何ですか:

アクティビティがサービスと通信できるように、(現在のstartServiceではなく)bindServiceを使用してサービスを開始する必要があると思います。

ただし、これを行うと、アクティビティを閉じた後にサービスが強制終了されます。

どうすれば両方を入手できますか?バインディングとフォアグラウンドサービス?

ありがとう!

17
ores

いいえ。bindServiceはサービスを開始しません。 _service connection_でServiceにバインドするだけなので、サービスのinstanceにアクセス/制御することができます。

要件に応じて、MediaPlayerのインスタンスが稼働していることを願っています。 Activityからサービスを開始してからbindからサービスを開始することもできます。 serviceがすでに実行されている場合はonStartCommand()が呼び出され、MediaPlayerインスタンスがnullでないかどうかを確認できます。その後、単に_START_STICKY_を返します。

このようにActivityを変更します。

_public class MainActivity extends ActionBarActivity {

    CustomService customService = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // start the service, even if already running no problem.
        startService(new Intent(this, CustomService.class));
        // bind to the service.
        bindService(new Intent(this,
          CustomService.class), mConnection, Context.BIND_AUTO_CREATE);
    }

    private ServiceConnection mConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            customService = ((CustomService.LocalBinder) iBinder).getInstance();
            // now you have the instance of service.
        }

        @Override
        public void onServiceDisconnected(ComponentName componentName) {
            customService = null;
        }
    };

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (customService != null) {
            // Detach the service connection.
            unbindService(mConnection);
        }
    }
}
_

MediaPlayerserviceで同様のアプリケーションがあります。このアプローチが役に立たない場合はお知らせください。

17
Libin

引用 Androidドキュメント

サービスも開始されていない限り、バインドされたサービスは、すべてのクライアントがバインド解除されると破棄されます

そして、startedboundの違いについては-を見てください https://developer.Android.com/guide/components/services.html

したがって、@ Libinの例のように、 startService を使用してからbindServiceを使用してサービスを作成する必要があります。次に、サービスは、 stopService または stopSelf を使用するまで、またはAndroidがそれを決定するまで)実行されます。それはリソースを必要とし、あなたを殺します。

11
naw