Androidの消費電力の最適化(2) - アラーム回避ウェイクCUP

免責事項:この記事はブロガーオリジナル記事ですが、許可ブロガーなく再生してはなりません。https://blog.csdn.net/u011077027/article/details/91602962

シーン解析

  1. 連続位置決めがサーバーに送信されました
  2. バックグラウンドタスクは、サーバーにハートビートを送信し続けます
  3. あなたは重要な操作の実行を遅らせることができます

開始

1つの目標捕捉AlarmManager

AlarmManager alarmManager =(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);

2セットラジオ

Intent intent = new Intent("LOCATION");
intent.setClass(this, DownloadReceiver.class);
    /**
     * 设置闹钟唤起时机和要发送的Intent
     * 其中广播发送时机如下:
     * AlarmManager.RTC_WAKEUP (硬件闹钟,System.currentTimeMillis())在指定的时间内发送Intent,并且会唤醒设备。
     
     * AlarmManager.RTC (硬件闹钟,System.currentTimeMillis())在指定的时间内发送广播,如果设备没有被唤醒则不会发送Intent,直到设备被唤醒才会发送Intent。
     
     * AlarmManager.ELAPSED_REALTIME_WAKEUP (真是时间SystemClock.elapsedRealtime())在指定的时间内发送广播,并唤醒设备。
     
     * AlarmManager.ELAPSED_REALTIME (真是时间SystemClock.elapsedRealtime())在指定的时间内发送广播,如果设备没有被唤醒则不会发送Intent,直到设备被唤醒才会发送Intent。
     
     * now + nextActionMillis 参数表示广播发送时间
     * SDK API < 19
    * */
mAlarmManager.set(AlarmManager.RTC_WAKEUP,now+nextActionMillis,
                  PendingIntent.getBroadcast(this,0,intent,PendingIntent.FLAG_ONE_SHOT));
    /**
     * 设置一个重复闹钟
     * 其中interval值如下
     * INTERVAL_FIFTEEN_MINUTES
     * INTERVAL_HALF_HOUR
     * INTERVAL_HOUR
     * INTERVAL_HALF_DAY
     * INTERVAL_DAY
     * SDK API < 19 高于19则不会被正常设定
     */
    mAlarmManager.setRepeating(int type, long triggerAtTime, long interval, PendingIntent operation);
    /**
     * 设置一个重复闹钟,但是这个方法会比较省电,系统会将若干闹钟合并为一个执行,来减少唤醒次数。
     * SDK API < 19 高于19则不会被正常设定
     */
    mAlarmManager.setInexactRepeating(int type, long triggerAtTime, long interval, PendingIntent operation);
    /**
     * SDK API >= 19 && SDK API < 23 在6.0上会在低电模式下无法使用。
     */
    mAlarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), pendingIntent);
    /**
     * SDK API >=23 解决低电下不能正常启动闹钟
     */
    mAlarmManager.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), pendingIntent);
    /**
     * 取消闹钟。
     */
    mAlarmManager.cancel(PendingIntent operation);

各のAndroidのバージョンはいくつかは失敗するので、より多くの注意を払うかもしれないが、別の方法を設定します。

放送受信機の3受け入れられている定義

<receiver android:name=".DownloadReceiver" android:exported="false">

4受信機の実装

public class DownloadReceiver extends BroadcastReceiver{
        public void onReceive(final Context context, final Intent intent){
            //带有唤醒锁,从任务开始直到任务结束。
            if (Constants.ACTION_RETRY.equals(action)) {
                startService(context);
            }
        }
    }

電力解析

パワーと精巧な以下の関係を生成する方法。

  1. タスクを使用してスケジュールAlarmManagerタスクが実行されるとき、それはロックに目覚めます。ミッションの終わりまで。
  2. デバイスを起動しますAlarmManager.RTC_WAKEUPとAlarmManager.ELAPSED_REALTIME_WAKEUP両方のタイプは、タスクを開始します。どちらも基本的にはないパワー。
  3. デバイスがウェイクアップされている場合にのみタスクを実行するには、2つの毛のテント後AlarmManager.ELAPSED_REALTIMEとAlarmManager.RTC。どちらも、エネルギー効率の高いことができます
  4. タスクサイクルの実行のために、それはAlarmManager.ELAPSED_REALTIMEとAlarmManager.RTCを設定するのが最適です

AlarmManager.ELAPSED_REALTIMEとしてこれら二つのAlarmManager.RTC SystemClock.elapsedRealtime()とのSystem.currentTimeMillis()時間との差こと。前者は睡眠中に変更されることはありませんが、睡眠は停止しません。後者は変更されるであろう。

AlarmManagerは良いタイマーの違いを支払います。AlarmManagerは、独立したハードウェアクロック(RTC)タイマモジュールに基づいています。ハードウェアは、通常時にCPUのスリープを実行することができますので、彼はCPUをウェイクアップすることができます。タイマーは、定期的に使用し、時にCPUスリープ失敗しています。

おすすめ

転載: blog.csdn.net/u011077027/article/details/91602962