2016-03-20 12 views
4

現在、私はそれと対話する必要があるのでバインド(音楽)サービスが必要です。しかし、私もには、すべてのコンポーネントがそれ自身をバインドしていない場合でも、を停止しないことを願っています。 Android Developer Guideアクティビティのバインドされたサービスを破棄しない

を言うように

は、「[...]複数のコンポーネントを一度にサービスにバインドすることができ、それらのすべてをバインド解除する場合、サービスが破棄されます。」

ガイドも

を語る「[...]あなたのサービスは、両方の方法を、動作することができます(無期限に実行する)とも結合を可能に開始することができます。」

私のアプリケーションでは、アプリケーションの起動時にサービスが開始されます。 私はカスタム通知で表示されているクローズボタンをユーザがクリックするだけで、このサービスを破壊したいと思っています。現在、私のMainActivityを破壊しているときにも、サービスは停止しています。

私はまた、同様の回答を読んだことがあります。このトピックはStackoverflowとgoogleで見つかったが、私には役に立たなかった。たぶん私は何かを見逃しているが、私はそれを理解できない。

私は今だところ、私は私のサービスを作成したいときは、これはと呼ばれている:

public void createServiceConnection(){ 
    musicConnection = new ServiceConnection(){ 
     @Override 
     public void onServiceConnected(ComponentName name, IBinder service) { 
      MusicService.MusicBinder binder = (MusicService.MusicBinder)service; 
      musicSrv = binder.getService(); 
      attachMusicService(); 
     } 
    }; 
} 

...ウィッヒはこれを呼び出します。

public void attachMusicService(){ 
    playerFragment.setMusicService(musicSrv); 
    musicSrv.attach(context); //need this for my listeners, nevermind 
    bindService(context); 
} 

...ウィッヒはこれを呼び出します。

public void bindService(Context act){ 
     if(playIntent==null){ 
      playIntent = new Intent(act, MusicService.class); 
      act.startService(playIntent); 

      act.bindService(playIntent, musicConnection, Context.BIND_AUTO_CREATE); 
     }else{ 
      act.startService(playIntent); 
      act.bindService(playIntent, musicConnection, Context.BIND_AUTO_CREATE); 
     } 

//finished. I can do stuff with my Service here. 
    } 

私は何か誤解しましたか? 私は最初にサービス開始を作成してバインドされているので、サービスが稼働し続けているように感じます。アクティビティも破棄されます。

答えて

0

コードが正しいようです。

は、私は私の問題は、私は表示通知したことが判明this Questionによると、ウィッヒはかなり興味深いものです。

サービスを無期限に実行するために作成されたサービスには、startForeground(NOTIFY_ID, notification);という通知が必要です。

私は、前notificationmanager.notify(NOTIFY_ID, notification);と私の通知を示した今、私は

`notificationmanager.notify(NOTIFY_ID, notification); 
    startForeground(NOTIFY_ID, notification);` 

を持っており、すべての私のバインドされた活動が破壊された後のサービスはもう止まりません。

+0

まず、「自分のコードが正しいかのようだ」と言うと、そうではないことを証明します:) – Wukash

+0

申し訳ありません。私が投稿したコード "を意味します。"問題は、私が質問で示したコードには含まれていませんでした。 –

+0

うん、私はちょうど私が少し微笑んだ:)。それが最も重要な部分であることから、startForegroundを既に呼び出していると確信していました。 – Wukash

0

カスタムアプリケーションクラスからサービスにバインドします。私はあなたに縛られているアクティビティが破壊された後(onDestroyが呼び出されたとき)、あなたがサービスを生かし続けることはできないと思います。サービスからstartForegroundを呼び出して、アクティビティが一時停止(onPause)してもサービスを維持できます

+1

"startService()"でサービスを開始すると、開始されたサービスのライフサイクルが続きます。だから私はサービスを破壊することなく、しばしば望むとおりバインドしてアンバインドすることができます。しかし、あなたの答えに戻る: "カスタムアプリケーションクラス"から?どういう意味? –

+0

次のようにApplicationクラスを拡張できます。public class MyApplication extends Application。次に、マニフェストアプリケーションタグにandroid:name = "。MyApplication"というタグを追加します。あなたのアプリケーションのonCreateメソッドをオーバーライドし、そこからサービスにバインドしてください。 – Wukash

+0

は面白いと思います。 しかし、私の問題を理解しただけで、今は動作しています。このトピックに興味があれば、私は答えを投稿しました - どうもありがとう! –

関連する問題