【Android 电量优化】电量优化 ( 使用 AlarmManager 保持 CPU 唤醒 )

举报
韩曙亮 发表于 2022/01/11 00:57:47 2022/01/11
【摘要】 文章目录 一、AlarmManager 简介二、使用 AlarmManager 保持 CPU 唤醒流程 ( 省电操作 )三、使用 WeakLock 保持 CPU 唤醒 代码示例1、Service ...



参考 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");
            }
        }
    };

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

② 注册广播接收者 : 注册上述创建的广播接收者 , 注册接收 ACTION 广播 ;

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

  
 
  • 1
  • 2

③ 创建延迟意图 : 首先创建普通的 Intent 意图 , 然后设置 ACTION 事件 , 根据该 Intent 创建延迟意图 PendingIntent ;

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

  
 
  • 1
  • 2
  • 3

④ 闹钟管理器设置 : 获取闹钟管理器 AlarmManager , 并设置每隔 50 秒发送一次广播 , 广播接收者接收到该意图 , 就会处理对应事件 ;

// 获取闹钟管理器
mAlarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
// 设置闹钟管理器每隔 50 秒发送一次延迟意图 
mAlarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME, 
SystemClock.elapsedRealtime(), 50000, pendingIntent);

  
 
  • 1
  • 2
  • 3
  • 4
  • 5




三、使用 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");
            }
        }
    };

}


  
 
  • 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
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79


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>

  
 
  • 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

40:51





四、源码及资源下载



源码及资源下载地址 :

文章来源: hanshuliang.blog.csdn.net,作者:韩曙亮,版权归原作者所有,如需转载,请联系作者。

原文链接:hanshuliang.blog.csdn.net/article/details/107165616

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。