2017-10-04 6 views
1

私は音楽を再生するためにアンドロイドアプリを開発中です。音楽を再生するためのAndroidサービス:なぜSTART_STICKYですか?

これまでのところ、私はEclipseのツールチップに「このモードはバックグラウンドミュージック再生を実行するサービスが意味をなさない」ため、あまり考えずに音楽を再生するサービスのonStartCommandからSTART_STICKYを返しました。

このメソッドが最初に行うことは、それが意図されているもの(再生、停止、次の曲、...)を見ていることです。

最近、音楽を再生しながらアプリを殺したとき(最近のアプリの概要で画面からドラッグして)、アプリがクラッシュしました。ログファイルを見ると、onStartCommand(ApllicationsとServiceのonCreateメソッドが呼び出された後)のインテントにアクセスしようとすると、NullPointerExceptionがスローされたことがわかりました。

if (intent == null){ 
    stopSelf(); 
    return START_NOT_STICKY; 
} 

しかし、再びSTART_STICKYSTART_NOT_STICKYの説明を読んだ後、私は疑問に思って:なぜSTART_STICKYは、音楽プレーヤーのために推奨されるだろう

私の最初の反射がゆえonStartCommand方法の先頭に挿入することでしたか?

2つの違いは、START_STICKYで開始されたサービスが強制終了された場合、そのサービスは再起動されます(intent = null)。 START_NOT_STICKYとすると、サービスは(ユーザーが要求しない限り)再起動されないため、常にインテントで呼び出され、nullであるかどうかを確認する必要はありません。

ユーザーがアプリを強制終了すると、サービスを再開しないようにすることは明らかです。

他のケースでは、サービスが再起動される可能性があるのは、リソースが不足しているためにサービスがシステムによって強制終了された場合です。そのような場合でも、一部のリソースが利用できるようになったため、ユーザーが音楽を予期せずに再生したいとは思わないと思います。

次の二つの答えは、リターンコードは、プロセスが殺された場合は、サービスを再起動する必要があるかどうかよりも、他の意味を持たないことを意味するもの:

はなぜSTART_STICKY音楽プレーヤーにおすすめですか?

+0

音楽を再生すると、音楽が他のアプリをしている間にバックグラウンドで実行し続けることになっている場合でも、MediaPlayerのクラス – Anonymous

+0

@Anonymousを使用するときにサービスが作成された新しいservice.Alreadyを必要としません。前景? – jakun

+0

はい、デフォルトではバックグラウンドで実行されています。音楽は、ユーザーがメモリから最新のアプリケーションをクリアしたときにのみ停止します。 – Anonymous

答えて

0

int型START_STICKY:onStartCommand(テント、int型、int型)から復帰する定数 :それは(onStartCommand(テント、int型、int型)から戻った後)に開始されている間、このサービスのプロセスが殺されている場合は、それを残しますこの配信されたインテントを保持しません。その後、システムはサービスを再作成しようとします。開始状態であるため、新しいサービスインスタンスの作成後にonStartCommand(Intent、int、int)を呼び出すことが保証されます。サービスに配信される保留中の開始コマンドがない場合は、ヌルインテントオブジェクトで呼び出されるため、これを確認するために注意する必要があります。このモードは、明示的に開始および停止されて実行されるものには意味がありますバックグラウンド音楽再生を実行するサービスのような任意の時間の間、

ので、このSTICKY SERVICE

+0

このサービスのプロセスが "殺された?それはサービスが走っているように私に聞こえるが、それはそのように見えない。私がアプリを殺すと、音楽が止まる(アプリがクラッシュする直前)。 – jakun

+0

サービスを再起動するのはなぜですか?私は本当にユーザーがデバイスを突然(たとえ彼ではなく、しばらくの間にアプリケーションを停止したオペレーティングシステムであっても)再生したいと思っているとは想像できません。 – jakun

+0

@ジャックンおそらく、マニフェストのStopwithtaskの属性をtrueに設定しているので、アプリサービスを停止するとstops.itが突然自動的にサービスを停止してサービスを停止することはありません。 –

1

START_STICKYを参照自己exolanatoryある - サービスは、十分なメモリが利用可能である場合、それは、低メモリから回復した後にサービスが、再作成され、次に低いメモリに停止した場合。ここでは、以前に計算した結果が失われます。

START_NOT_STICKY - サービスが停止している場合、十分なメモリがある場合でも、サービスを再起動する必要はありません。

また、ユーザがアプリケーションを終了したときに、タスクキラーを使用してプロセスを停止しない限り、サービスは停止されません。サービスに関する詳細は、このリンクを確認してください。

http://www.vogella.com/tutorials/AndroidServices/article.html

+0

です:これは私が言及した答えとよく似ています。私は両者の違いを理解すると信じています。私の質問は、START_STICKYは音楽プレーヤーにおすすめです – jakun

+0

音楽作成者が音楽制作者のアプリケーションが殺され、すでに再生している曲を既に作成している場合は、START_STICKYを使用してアンドロイドシステムによってメモリが獲得された場合に再起動しますSTART_NOT_STICKYは、手動でアプリケーションに行って、アプリの殺害に関して – Anonymous

+0

という曲を再生しない限り、サービスを再開しません。スワイプを使用して最近のアプリのリストから削除しますホームボタン。そうするうちに、音楽はすぐに再生が止まり、サービスが止まったという明瞭な兆候です。アプリがクラッシュしたのは、私がホーム画面に戻った後でした。 – jakun

関連する問題