2

私は自分のアプリで身元調査を行う必要があります。基本的には、さまざまなURLをポーリングして新しいものを探します。だから私はこれがAlarmManagerで行われることを読みました。

重要なのは、新しいものが到着したらすぐにユーザーに通知する必要がないということです。たとえば、1時間ごとにチェックしているとしましょう。電話がスリープしている間はチェックを行わず、電話が使用されているときにチェックを再開することで、まったく問題ありません。そうすれば、ユーザーは最終的に通知を受け取りますが、無駄は最小限に抑えられます。

だから私はsetInExactRepeatingを試してみました。起動時だけでなく、アプリの起動時にも起動します(主に、インストール後のセッションで、アプリが「強制終了」された場合でも実行されていることを確認します)。これらすべてのチェックが合計されないようにするにはどうすればよいですか?(新しいチェックは、何も実行されていない場合、または前のチェックを停止する必要がある場合にのみ実行する必要があります)。

4

2 に答える 2

7

setInexactRepeatingとELAPSED_REALTIME(またはRTC)を組み合わせると、バッテリーの消耗を最小限に抑えることができます。既存の保留中のインテント(同じインテントとID)でフラグFLAG_UPDATE_CURRENTを使用すると、現在のアラームスケジュールがすでに存在する場合は単に更新されます。または、Ralghaによって提案されたコードを追加して、保留中のインテントがすでに作成されているかどうかを確認してアラームを設定し、作成されていない場合は、保留中のインテントとアラームスケジュールを設定します。どちらの方法も、バッテリーに同じ影響を与える可能性があります(無視できます)。かなりの消耗を引き起こすのは、頻繁なスケジュールで何かをしていることです。画面がオフのときではなく、1時間ごとにのみ更新する必要があるという事実により、アプリはほとんどバッテリーを使用しません(比較的迅速に処理され、その後正常にクリーンアップされると仮定します)

http://developer.android.com/reference/android/app/AlarmManager.html#ELAPSED_REALTIME

ELAPSED_REALTIME

このアラームはデバイスをウェイクアップしません。デバイスがスリープ状態のときに消灯した場合、次にデバイスがウェイクアップするまで配信されません。

http://developer.android.com/reference/android/app/AlarmManager.html#setInexactRepeating%28int,%20long,%20long,%20android.app.PendingIntent%29

setInexactRepeating

これらのアラームは、setRepeating(int、long、long、PendingIntent)によって提供される厳密な繰り返しよりも電力効率が高くなります。これは、システムがアラームのフェーズを調整して同時にアラームを発生させ、デバイスを必要以上にスリープから復帰させないようにするためです。

http://developer.android.com/reference/android/app/PendingIntent.html#FLAG_UPDATE_CURRENT

FLAG_UPDATE_CURRENT

...説明されているPendingIntentがすでに存在する場合は、それを保持しますが、余分なデータをこの新しいインテントにあるものに置き換えます。これは、エクストラのみが変更されるインテントを作成していて、以前のPendingIntentを受け取ったエンティティが、明示的に指定されていなくても、新しいエクストラでそれを起動できることを気にしない場合に使用できます。

于 2012-12-28T22:27:22.507 に答える
1

アラームを設定する前に、アラームがすでに設定されているかどうかを確認できます。また、フラグを使用して、デバイスがスリープ状態になるまでアラームが配信されないようにすることもできます。

if(PendingIntent.getBroadcast(context、0、updateIntent、PendingIntent.FLAG_NO_CREATE)== null)
{{
    保留中の意図=PendingIntent.getBroadcast(コンテキスト、0、updateIntent、0);
    getSystemService(ALARM_SERVICE).setInexactRepeating(AlarmManager.RTC、System.currentTimeMillis()、AlarmManager.INTERVAL_HOUR、pendingIntent);
}
于 2012-12-28T22:27:12.303 に答える