【Android 電量優化】電量優化 ( 喚醒鎖定 | 使用 WeakLock 保持服務喚醒 | 屏幕喚醒 )



參考 Google 官方文檔 :





一、使用 WeakLock 保持 CPU 喚醒 ( 費電操作 )





1、保持 CPU 喚醒


1 . Android 設備休眠次序 : Android 設備長時間不使用時 , ① 屏幕先變暗 , ② 然後屏幕關閉 , ③ 最後關閉 CPU ;


2 . CPU 喚醒狀態 : 如果 CPU 被關閉了 , 那麼 Service 服務 , 肯定無法運行了 , 這裏需要讓 CPU 保持喚醒狀態 ;


3 . Service 服務後臺運行 : 後臺 Service 服務運行時 , 需要 CPU 喚醒 , 維持後臺服務運行 ;



2、使用 WeakLock 保持 CPU 喚醒流程


使用 WeakLock 保持 CPU 喚醒流程 :


① 獲取 PowerManager 服務 : 跨進程獲取 PowerManager 服務 ;

PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);

② 判斷是否支持 CPU 喚醒 : 調用 PowerManager 對象的 isWakeLockLevelSupported 方法 , 獲取該設備是否支持 CPU 喚醒操作 ;

powerManager.isWakeLockLevelSupported(PowerManager.PARTIAL_WAKE_LOCK)

③ 創建 PowerManager.WakeLock : 調用 PowerManager 對象 的 newWakeLock 方法 , 創建喚醒鎖 ;

mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "WAKE_LOCK");

④ 開啓喚醒 CPU 操作 : 調用 PowerManager.WakeLock 對象的 acquire 開始喚醒 CPU 操作 ;

mWakeLock.acquire();

⑤ 結束喚醒 CPU 操作 : 不需要 CPU 喚醒時 , 及時釋放喚醒鎖 ;

mWakeLock.release();


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


1 . 在 AndroidManifest.xml 中設置權限 : 刪除了大部分配置 , 只保留必要配置 ;

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

    <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>

        <!-- WeakLock 保持 CPU 喚醒的 Service 服務 -->
        <service
            android:name=".WeakLockService"
            android:process=":weaklock" />

    </application>

</manifest>

2 . 服務 Service 保持 CPU 喚醒代碼示例 :

package kim.hsl.bp;

import android.annotation.SuppressLint;
import android.app.Service;
import android.content.Intent;
import android.os.Build;
import android.os.IBinder;
import android.os.PowerManager;

import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;

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

    /**
     * 喚醒鎖定 服務
     */
    private PowerManager.WakeLock mWakeLock;

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

    @SuppressLint("InvalidWakeLockTag")
    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    @Override
    public void onCreate() {
        super.onCreate();
        // 跨進程獲取 PowerManager 服務
        PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);

        // 判斷是否支持 CPU 喚醒
        boolean isWakeLockLevelSupported = powerManager.
        		isWakeLockLevelSupported(PowerManager.PARTIAL_WAKE_LOCK);

        // 支持 CPU 喚醒 , 才保持喚醒
        if(isWakeLockLevelSupported){
            // 創建只喚醒 CPU 的喚醒鎖
            mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "WAKE_LOCK");

            // 開始喚醒 CPU
            mWakeLock.acquire();
        }


    }
    
    @Override
    public void onDestroy() {
        super.onDestroy();
        // 釋放 CPU 喚醒鎖
        if(mWakeLock != null){
            mWakeLock.release();
        }
    }
}





二、屏幕喚醒



屏幕喚醒操作 :


① 代碼中設置 : 在 Activity 中爲 Window 添加 WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON 標識 ;

package kim.hsl.bp;

import android.os.Bundle;
import android.view.WindowManager;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
    public static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    }
}

② 配置文件設置 : 在佈局的根標籤中設置 android:keepScreenOn=“true” 屬性 ;

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:keepScreenOn="true"
    tools:context=".MainActivity">
    
</androidx.constraintlayout.widget.ConstraintLayout>

上述配置不需要特殊權限 , 不需要維護資源的申請釋放 ;





三、源碼及資源下載



源碼及資源下載地址 :

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