您当前的位置: 首页 >  android

韩曙亮

暂无认证

  • 3浏览

    0关注

    1068博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【Android 电量优化】电量优化 ( 唤醒锁定 | 使用 WeakLock 保持服务唤醒 | 屏幕唤醒 )

韩曙亮 发布时间:2020-07-06 19:17:46 ,浏览量:3

文章目录
  • 一、使用 WeakLock 保持 CPU 唤醒 ( 费电操作 )
    • 1、保持 CPU 唤醒
    • 2、使用 WeakLock 保持 CPU 唤醒流程
    • 3、使用 WeakLock 保持 CPU 唤醒代码示例
  • 二、屏幕唤醒
  • 三、源码及资源下载

参考 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 中设置权限 : 删除了大部分配置 , 只保留必要配置 ;



    

    
        
            
                

                
            
        

        
        

    


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” 属性 ;



    

上述配置不需要特殊权限 , 不需要维护资源的申请释放 ;

三、源码及资源下载

源码及资源下载地址 :

  • ① GitHub 工程地址 : Battery_Performance

  • ② 使用 WeakLock 保持 CPU 唤醒 Service 代码地址 : WeakLockService.java

  • ③ AndroidManifest.xml 配置文件地址 : AndroidManifest.xml

  • ④ 屏幕唤醒 MainActivity.java 地址 : MainActivity.java

  • ⑤ 屏幕唤醒布局文件 activity_main.xml 地址 : activity_main.xml

关注
打赏
1663594092
查看更多评论
立即登录/注册

微信扫码登录

0.0420s