8

アプリを閉じていても、1 時間ごとに関数を実行する必要があるアプリを作成しています。

まず、サービスを作成することを考えましたが、テスト中に、android がサービスを強制終了することがあることに気付きました。そこで別の解決策を探していたところ、AlarmManager を見つけました。私はそれを実装しましたが、うまくいくようですが、同じサービスが発生するのか、それとも永遠に実行されるのか疑問がありますか? (モバイルの再起動まで...)

別の質問ですが、アラーム マネージャでプロセスを実行するには、新しいスレッドを作成する必要がありますか、それとも他のスレッドで直接実行しますか?

4

2 に答える 2

6

私はそれを実装しましたが、うまくいくようですが、同じサービスが発生するのか、それとも永遠に実行されるのか疑問がありますか? (モバイルの再起動まで...)

それはまで実行されます:

  • あなたが指摘したように、デバイスが再起動されるか、または
  • ユーザーがアプリをアンインストールする、または
  • 自分でイベントをキャンセルする、または
  • ユーザーが [設定] に移動し、インストール済みアプリのリストでアプリを見つけ、そのエントリをタップして、[強制停止] ボタンをクリックします。

アプリがアップグレードされた後、アラームを再度スケジュールする必要がある可能性があります (忘れました...)。

アラームマネージャでプロセスを実行するために新しいスレッドを作成する必要がありますか、それとも他のスレッドで直接実行されますか??

実行しようとしている作業が数ミリ秒しかかからない場合を除き、バックグラウンド スレッドが必要になります。これにより、次の 2 つのパターンが考えられます。

  1. _WAKEUP式のアラームを使用していない場合は、 a を使用して、毎時getService() PendingIntentに制御を送信します。IntentService

  2. _WAKEUPスタイルのアラームを使用している場合は、 を使用する必要があり、 mygetBroadcast() PendingIntentのサブクラスを呼び出すか、自分で管理してデバイスを起動させたままにしておく必要があります。WakefulIntentServiceWakeLock

于 2013-04-22T22:58:58.660 に答える
3

いいえ、Android はスケジュールされたアラームを強制終了せず、アプリが置き換えられるか、デバイスが再起動されない限り、計画どおりに実行されます。これらのイベントのブロードキャスト レシーバを使用して、アラームのスケジュールを変更します。強制停止はアプリのすべてのコンポーネントとスレッドを完全に強制終了するため、これを防ぐ方法はありません。

これは、Alarm Manager の機能によって異なります。ブロードキャストを送信する場合、受信制限は 10 秒です。

アクティビティ、サービス、またはインテント サービスを開始する場合、制限はありません。アクティビティとサービスの場合は、それを終了または停止する必要があり、インテント サービスの場合は、プロセスが完了するまで終了する必要があります。Intent Service 内に別のスレッドを持つことはできず、OnHandleIntent 内のコードに限定されることに注意してください。

また、デバイスの状態を考慮する必要があります。スリープ状態で Wake Up フラグ レシーバーを使用している場合、ウェイク ロックは必要ありませんが、他のレシーバーは必要です。デバイスがスリープ状態に戻るのにそれほど時間はかかりません。

アラーム マネージャーが必要なことを行うため、サービスでシステム リソースを無駄にしないでください。

于 2013-04-22T23:04:35.480 に答える