【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);
- 1
② 判断是否支持 CPU 唤醒 : 调用 PowerManager 对象的 isWakeLockLevelSupported 方法 , 获取该设备是否支持 CPU 唤醒操作 ;
powerManager.isWakeLockLevelSupported(PowerManager.PARTIAL_WAKE_LOCK)
- 1
③ 创建 PowerManager.WakeLock : 调用 PowerManager 对象 的 newWakeLock 方法 , 创建唤醒锁 ;
mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "WAKE_LOCK");
- 1
④ 开启唤醒 CPU 操作 : 调用 PowerManager.WakeLock 对象的 acquire 开始唤醒 CPU 操作 ;
mWakeLock.acquire();
- 1
⑤ 结束唤醒 CPU 操作 : 不需要 CPU 唤醒时 , 及时释放唤醒锁 ;
mWakeLock.release();
- 1
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>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
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();
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
二、屏幕唤醒
屏幕唤醒操作 :
① 代码中设置 : 在 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);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
② 配置文件设置 : 在布局的根标签中设置 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>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
上述配置不需要特殊权限 , 不需要维护资源的申请释放 ;
三、源码及资源下载
源码及资源下载地址 :
-
① GitHub 工程地址 : Battery_Performance
-
② 使用 WeakLock 保持 CPU 唤醒 Service 代码地址 : WeakLockService.java
-
③ AndroidManifest.xml 配置文件地址 : AndroidManifest.xml
-
④ 屏幕唤醒 MainActivity.java 地址 : MainActivity.java
-
⑤ 屏幕唤醒布局文件 activity_main.xml 地址 : activity_main.xml
文章来源: hanshuliang.blog.csdn.net,作者:韩曙亮,版权归原作者所有,如需转载,请联系作者。
原文链接:hanshuliang.blog.csdn.net/article/details/107155410
- 点赞
- 收藏
- 关注作者
评论(0)