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

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

文章目录

一、AlarmManager 简介

二、使用 AlarmManager 保持 CPU 唤醒流程 ( 省电操作 )

三、使用 WeakLock 保持 CPU 唤醒 代码示例

1、Service 代码示例

2、AndroidManifest.xml 服务配置

四、源码及资源下载



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


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


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


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


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


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


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






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





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>


40:51






四、源码及资源下载


源码及资源下载地址 :


① GitHub 工程地址 : Battery_Performance


② 使用 AlarmManager 保持 CPU 唤醒 Service 代码地址 : AlarmManagerService.java


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


目录
相关文章
|
16天前
|
缓存 编解码 Android开发
Android内存优化之图片优化
本文主要探讨Android开发中的图片优化问题,包括图片优化的重要性、OOM错误的成因及解决方法、Android支持的图片格式及其特点。同时介绍了图片储存优化的三种方式:尺寸优化、质量压缩和内存重用,并详细讲解了相关的实现方法与属性。此外,还分析了图片加载优化策略,如异步加载、缓存机制、懒加载等,并结合多级缓存流程提升性能。最后对比了几大主流图片加载框架(Universal ImageLoader、Picasso、Glide、Fresco)的特点与适用场景,重点推荐Fresco在处理大图、动图时的优异表现。这些内容为开发者提供了全面的图片优化解决方案。
|
3月前
|
JavaScript Linux 网络安全
Termux安卓终端美化与开发实战:从下载到插件优化,小白也能玩转Linux
Termux是一款安卓平台上的开源终端模拟器,支持apt包管理、SSH连接及Python/Node.js/C++开发环境搭建,被誉为“手机上的Linux系统”。其特点包括零ROOT权限、跨平台开发和强大扩展性。本文详细介绍其安装准备、基础与高级环境配置、必备插件推荐、常见问题解决方法以及延伸学习资源,帮助用户充分利用Termux进行开发与学习。适用于Android 7+设备,原创内容转载请注明来源。
527 76
|
5月前
|
存储 设计模式 监控
快速定位并优化CPU 与 JVM 内存性能瓶颈
本文介绍了 Java 应用常见的 CPU & JVM 内存热点原因及优化思路。
783 166
|
3月前
|
存储 设计模式 监控
如何快速定位并优化CPU 与 JVM 内存性能瓶颈?
如何快速定位并优化CPU 与 JVM 内存性能瓶颈?
如何快速定位并优化CPU 与 JVM 内存性能瓶颈?
|
10月前
|
移动开发 监控 前端开发
构建高效Android应用:从优化布局到提升性能
【7月更文挑战第60天】在移动开发领域,一个流畅且响应迅速的应用程序是用户留存的关键。针对Android平台,开发者面临的挑战包括多样化的设备兼容性和性能优化。本文将深入探讨如何通过改进布局设计、内存管理和多线程处理来构建高效的Android应用。我们将剖析布局优化的细节,并讨论最新的Android性能提升策略,以帮助开发者创建更快速、更流畅的用户体验。
130 10
|
6月前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
596 7
|
9月前
|
存储 缓存 编解码
Android经典面试题之图片Bitmap怎么做优化
本文介绍了图片相关的内存优化方法,包括分辨率适配、图片压缩与缓存。文中详细讲解了如何根据不同分辨率放置图片资源,避免图片拉伸变形;并通过示例代码展示了使用`BitmapFactory.Options`进行图片压缩的具体步骤。此外,还介绍了Glide等第三方库如何利用LRU算法实现高效图片缓存。
137 20
Android经典面试题之图片Bitmap怎么做优化
|
8月前
|
调度 Android开发 开发者
构建高效Android应用:探究Kotlin多线程优化策略
【10月更文挑战第11天】本文探讨了如何在Kotlin中实现高效的多线程方案,特别是在Android应用开发中。通过介绍Kotlin协程的基础知识、异步数据加载的实际案例,以及合理使用不同调度器的方法,帮助开发者提升应用性能和用户体验。
137 4
|
8月前
|
存储 缓存 算法
CPU优化
【10月更文挑战第7天】
232 1
|
7月前
|
安全 Android开发 iOS开发
深入探索iOS与Android系统的差异性及优化策略
在当今数字化时代,移动操作系统的竞争尤为激烈,其中iOS和Android作为市场上的两大巨头,各自拥有庞大的用户基础和独特的技术特点。本文旨在通过对比分析iOS与Android的核心差异,探讨各自的优势与局限,并提出针对性的优化策略,以期为用户提供更优质的使用体验和为开发者提供有价值的参考。

热门文章

最新文章