web-dev-qa-db-ja.com

どのようにしてサービスが無期限に実行され、Androidでのバインドが可能になるのですか?

サービスを開始したコンポーネントが破棄され、アクティビティへのバインドも許可されている場合でも、停止するまでバックグラウンドで実行できるサービスが必要です。どのように可能ですか?

Androidバインドされたサービスのドキュメント-バインドされたサービスを作成するには3つの方法があります

  1. Binderクラスを拡張しています。
  2. メッセンジャーの使用。
  3. AIDLの使用。

メッセンジャー(2番目の方法)を使用してバインドされたサービスを作成しました。アクティビティは、onStart()メソッドでサービスにバインドされ、onStop()メソッドでバインド解除されます。双方向メッセージング(アクティビティとサービスの間)は正しく機能します。しかし問題は、アクティビティがサービスのバインドを解除すると、サービスが破壊されることです。しかし、無期限に実行できるサービスが必要です。

Android Services Dev Guide -"このドキュメントでは通常、これらの2種類のサービスについて個別に説明していますが、サービスは両方の方法で機能し、開始することができます(無制限に実行され、バインディングも許可されます。コンポーネントがそれを開始できるようにするonStartCommand()とバインディングを許可するonBind()の2つのコールバックメソッドを実装するかどうかだけが問題です。」

サービスにonStartCommand()メソッドも実装してSTART_STICKYを返しますが、呼び出されることはありません。開発ガイドで制限付きサービスのライフサイクルコールバックを見ると、onStartCommand()コールバックメソッドはありません。次に、停止してバインディングも許可するまでサービスを実行することはどのように可能ですか?

Fedora 15 OSでEclipseプラットフォームを使用しています。

任意のヘルプ...

37
Khushbu Shah

どこかでstartService()で開始するだけです。これにより、バインディングがなくなったときに自動的に停止しなくなります。

Service documentation から、私の強調:

サービスは開始することも、接続をバインドすることもできます。このような場合、システムは、サービスが開始されているか、コンテキストへの接続がある限り、サービスを実行し続けます。 BIND_AUTO_CREATEフラグ。

他の人が指摘したように、Androidによって強制終了される可能性があります。サービスを「優先順位付け」して、サービスを強制終了した場合に強制終了される可能性を低くすることができます フォアグラウンドサービス

47
Joel F

メッセンジャーサービスでサービスを使用していませんが、リモート(AIDL)インターフェイスでリモートサービスにバインドしています。私の調査結果はいくつかの助けになるかもしれません。私の主な活動とサービスは現在実装されているので、次のようなコードで行うようにサービスにバインドします

mServiceConnected = bindService(new Intent("com.mypackage.MyService.SERVICE"), this,
                Context.BIND_AUTO_CREATE);

私のアクティビティはServiceConnectionを実装しています

unbindService(this)を呼び出してアクティビティが終了すると、サービスのonDestroy()メソッドは呼ばれた。

ただし、bindService行の前に、サービスを明示的に開始する場合

startService(new Intent("com.mypackage.MyService.SERVICE"));

その後、unBindはサービスのonDestroy()を実行させません。それでも、アクティビティのonDestroy/StopでunbindServiceを呼び出す必要があります。そうしないと、サービス接続がリークします。

私の場合、おそらくそのサービスは、リモートインターフェイスを介して他のアプリケーションがバインドするために引き続き利用可能です。

6
NickT

_Service.onStartCommand_startServiceメソッドを使用してサービスを開始したときにのみコールバックが呼び出されます。 @NickTと@JoelFがすでに指摘したように、startService()以外にbindService()を呼び出す必要があります(例:onCreateで)。

また、この記事(少し古くなっていますが、まだ便利です)の記事「 サービスの二重の寿命 」を見て、提供されているサンプルプログラムの作成者を試してみることもできます。

3
Idolon

serviceactivityの間の通信を実行するため。公式Androidの例で説明されているように、バインダーを使用することもできます。

http://developer.Android.com/reference/Android/app/Service.html#LocalServiceSample

公式としてAndroidドキュメントの提案 http://developer.Android.com/guide/components/services.html#StartingAService

このドキュメントでは通常、これらの2種類のサービスについて個別に説明していますが、サービスは両方の方法で機能できます。つまり、サービスを開始して(無期限に実行する)、バインドを許可することもできます。これは、いくつかのコールバックメソッドを実装するかどうかの問題です。コンポーネントがそれを開始できるようにするonStartCommand()と、バインディングを許可するonBind()です。

このプロジェクトは、このサービスの混合(BothService)を実装し、Service無期限に実行し、複数のアクティビティとのバインドも許可します。

https://github.com/shanrais/BothService

2
shanraisshan

Android App Drawerに"Ongoing Notification"を追加すると、アプリとサービスが強制終了されることはありません。

チェックアウト http://developer.Android.com/guide/topics/ui/notifiers/notifications.html

1
Abhijeet Pathak

サービスバインダーを使用して、アプリインスタンスレベルで接続の単一インスタンスを作成できます。これは、アプリのonCreateで、サービスを存続させます。サービスはフォアグラウンドサービスである必要があります

0
Qumber Abbas