【Android 電量優化】電量優化 ( 使用 AlarmManager 保持 CPU 喚醒 )



參考 Google 官方文檔 :

上一篇博客 【Android 電量優化】電量優化 ( 喚醒鎖定 | 使用 WeakLock 保持服務喚醒 | 屏幕喚醒 ) 中 , 使用 WeakLock 保持 CPU 喚醒 , 全程 CPU 都處於工作狀態 , 該操作耗電量非常大 ;

AlarmManager 可以一定程度上替代上述 WeakLock , 並且可以穩定每隔一段時間喚醒 CPU , 避免了 CPU 全程喚醒的情況 , 同時也降低了耗電量 ;





一、AlarmManager 簡介



AlarmManager 簡介 :


① 激活時間 : AlarmManager 可以脫離於應用生命週期限制 , 每隔一段時間 , 定期執行任務 ; 即使應用沒有執行 , 或者手機處於休眠狀態 , 也可以觸發執行操作 ;

② 間隔設定 : 開發者可以設定觸發任務執行的週期 , 該任務一般是通過發送延遲意圖 PendingIntent 實現 ;

③ 廣播接收者 : 一般使用 AlarmManager 定時發送 延遲意圖 PendingIntent 給廣播接收者 , 在廣播接收者中啓動服務 , 或者執行其它任務 ;

④ 降低資源消耗 : 如上述保持 CPU 喚醒 , 全程耗電 , 使用 AlarmManager 每隔一段時間 , 喚醒一次 , 執行任務 , 然後繼續休眠 , 可以極大降低資源消耗 ;





二、使用 AlarmManager 保持 CPU 喚醒流程 ( 省電操作 )



使用 AlarmManager 保持 CPU 處於喚醒狀態 , 比使用 WeakLock 更省電 ;


使用 AlarmManager 保持 CPU 喚醒流程 :


① 創建自定義廣播接收者 : 這裏爲了簡單 , 在 Service 中簡單創建一個廣播接收者 , 處理 ACTION 事件 ;

    private BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            // 獲取廣播事件
            String action = intent.getAction();
            if(TextUtils.equals("ACTION", action)){
                Log.i(TAG, "receiver ACTION");
            }
        }
    };

② 註冊廣播接收者 : 註冊上述創建的廣播接收者 , 註冊接收 ACTION 廣播 ;

IntentFilter intentFilter = new IntentFilter("ACTION");
registerReceiver( receiver, intentFilter);

③ 創建延遲意圖 : 首先創建普通的 Intent 意圖 , 然後設置 ACTION 事件 , 根據該 Intent 創建延遲意圖 PendingIntent ;

mAlarmIntent = new Intent();
mAlarmIntent.setAction("ACTION");
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, mAlarmIntent, 0);

④ 鬧鐘管理器設置 : 獲取鬧鐘管理器 AlarmManager , 並設置每隔 50 秒發送一次廣播 , 廣播接收者接收到該意圖 , 就會處理對應事件 ;

// 獲取鬧鐘管理器
mAlarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
// 設置鬧鐘管理器每隔 50 秒發送一次延遲意圖 
mAlarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME, 
SystemClock.elapsedRealtime(), 50000, pendingIntent);




三、使用 WeakLock 保持 CPU 喚醒 代碼示例





1、Service 代碼示例



package kim.hsl.bp;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;
import android.os.SystemClock;
import android.text.TextUtils;
import android.util.Log;

import androidx.annotation.Nullable;

public class AlarmManagerService extends Service {
    public static final String TAG = "AlarmManagerService";

    /**
     * 鬧鐘意圖
     */
    private Intent mAlarmIntent;

    /**
     * 鬧鐘管理器
     */
    private AlarmManager mAlarmManager;

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        // 使用鬧鐘管理器保持 CPU 喚醒
        alarmKeep();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    private void alarmKeep(){
        // 註冊廣播接受者
        IntentFilter intentFilter = new IntentFilter("ACTION");
        registerReceiver( receiver, intentFilter);

        // 創建延遲意圖
        mAlarmIntent = new Intent();
        mAlarmIntent.setAction("ACTION");
        PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, mAlarmIntent, 0);

        // 獲取鬧鐘管理器, 並設置每隔 50 秒發送一次廣播
        mAlarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
        mAlarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME, 
        	SystemClock.elapsedRealtime(), 50000, pendingIntent);
    }

    /**
     * 接收上面每隔 5 秒發送的廣播
     */
    private BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            // 獲取廣播事件
            String action = intent.getAction();
            if(TextUtils.equals("ACTION", action)){
                Log.i(TAG, "receiver ACTION");
            }
        }
    };

}



2、AndroidManifest.xml 服務配置



<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="kim.hsl.bp">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <!-- AlarmManager  保持 CPU 喚醒的 Service 服務 -->
        <service
            android:name=".AlarmManagerService"
            android:process=":alrmmanager" />

    </application>

</manifest>

40:51





四、源碼及資源下載



源碼及資源下載地址 :

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章