ここで最初の質問ですが、私はしばらく前から出回っています。
私は何を持っていますか:
オーディオストリームとオンラインプレイリストを再生するAndroidアプリを作成しています。現在はすべて正常に機能していますが、サービスとの通信に問題があります。
音楽はstartForegroundで開始されたサービスで再生されているため、強制終了されません。
トラック名、画像、その他いくつかのものを取得するために、自分のアクティビティからサービスと通信する必要があります。
私の問題は何ですか:
アクティビティがサービスと通信できるように、(現在のstartServiceではなく)bindServiceを使用してサービスを開始する必要があると思います。
ただし、これを行うと、アクティビティを閉じた後にサービスが強制終了されます。
どうすれば両方を入手できますか?バインディングとフォアグラウンドサービス?
ありがとう!
いいえ。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);
}
}
}
_
MediaPlayer
service
で同様のアプリケーションがあります。このアプローチが役に立たない場合はお知らせください。
引用 Androidドキュメント :
サービスも開始されていない限り、バインドされたサービスは、すべてのクライアントがバインド解除されると破棄されます
そして、startedとboundの違いについては-を見てください https://developer.Android.com/guide/components/services.html
したがって、@ Libinの例のように、 startService
を使用してからbindService
を使用してサービスを作成する必要があります。次に、サービスは、 stopService
または stopSelf
を使用するまで、またはAndroidがそれを決定するまで)実行されます。それはリソースを必要とし、あなたを殺します。