文章目錄
參考 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>
上述配置不需要特殊權限 , 不需要維護資源的申請釋放 ;
三、源碼及資源下載
源碼及資源下載地址 :
-
① GitHub 工程地址 : Battery_Performance
-
② 使用 WeakLock 保持 CPU 喚醒 Service 代碼地址 : WeakLockService.java
-
③ AndroidManifest.xml 配置文件地址 : AndroidManifest.xml
-
④ 屏幕喚醒 MainActivity.java 地址 : MainActivity.java
-
⑤ 屏幕喚醒佈局文件 activity_main.xml 地址 : activity_main.xml