1

誰かが私が望ましい機能の適切な設計に従っているかどうかを確認できますか?

AndroidManifestに登録できないデバイスでアプリを少なくとも1回実行した場合、ブロードキャストレシーバーによって2種類のインテントをリッスンする必要があります。

  • android.intent.action.SCREEN_ON
  • android.intent.action.SCREEN_OFF

このため、MainActivityの起動時に開始されるサービスを作成しました。サービスの方法で、onStartCommand私はこれらの放送受信機を登録します...

次に、これらのブロードキャストレシーバー内で、SharedPreferencesから取得したフラグに基づいて0(何もしない)または1(適切なロジックを実行する)のいずれかが実行されます。

MainActivityがメモリ/スタックから削除され、インテントがリッスンする場合でも、Androidによって停止/強制終了されない(デバイスの妨害や過負荷を引き起こさないと仮定して)サービスのライフサイクルを正しく理解していますか?

4

1 に答える 1

2

いくつかのこと:

  • onCreate()このメソッドはサービスの作成時に1回だけ呼び出されるため、代わりにサービスにレシーバーを登録します。startService()複数回呼び出すと、への呼び出しが増えます。onStartCommand()つまり、受信機を常に作り直していることになります。

Context.startService()への複数の呼び出しはネストされないことに注意してください(ただし、onStartCommand()への複数の対応する呼び出しが発生します)。したがって、サービスが何度開始されても、Context.stopService()またはstopSelfでサービスが停止されます。 ()が呼び出されます。

  • 必ずレシーバーの登録を解除してください。私は通常これをonDestroy()

また、ライフサイクルの質問について-通常のサービスは理由なく殺されるべきではなく、それを起動したアクティビティから独立して実行する必要があります(バインドされたサービスは私が覚えているものとは少し異なります)が、UIスレッドと同じプロセスで実行されます(特に指定しない限り)。ただし、長い時間が経過し、サービスがフォアグラウンドにない場合。殺される可能性があります。onStartCommand()これが、返品を行う必要がある理由ですSTART_STICKY。システムがサービスを強制終了した場合、可能な場合は再起動します。フォアグラウンドにある場合、サービスも強制終了される可能性がありますが、これは最後の手段としての強制終了です。START_STICKYただし、サービスでエラーが発生しやすい場合は、問題が発生する可能性があります。たとえば、私のサービスはクラッシュし続けました。START_STICKYしばらくしてから再起動し、その後再びクラッシュし、サイクルが繰り返されました。

通常の状況でサービスが強制終了されないように安全なのは、次の場合のみです。

サービスが現在onCreate()、onStartCommand()、またはonDestroy()メソッドでコードを実行している場合、ホスティングプロセスは、このコードが強制終了されることなく実行できるようにするためのフォアグラウンドプロセスになります。

于 2013-03-05T23:02:01.537 に答える