Android耗电优化需要注意的要点

news2024/11/15 23:55:07

作者:小墙程序员

在应用开发中,耗电是我们需要关注的重点。但是,开始进行耗电优化时,我们常常感到无从下手。这篇文章将介绍耗电优化的相关要点,让我们优化时有一个方向。

传感器

大多数Android设备都内置传感器,如果你的 App 需要使用传感器,记得在不使用时及时取消注册监听,否则会让 app 在后台一直接收数据,造成不必要的耗电。

如上图,谷歌官方文档上写的很清楚。当我们在Activity切到后台后依然会调用传感器,一般来说onPause之后就已经是非业务场景,在 destroy之前都会持续占用传感器,造成不必要的耗电。

其次,注册传感器时,可以选择传感器精度,精度越高耗电也就越多,我们需要根据业务实际需求选择合适的精度,不要盲目追求高精度。

定位

定位从获取方式可以分为两种,主动获取 或 被动定位。主动获取又可以分为 GPS 和 网络定位。

  • GPS_PROVIDER(GPS方式):

    1. GPS定位,精准度高耗电量大;
    2. 室内GPS定位基本没用。
    3. 绝大部分用户默认不开启GPS模块;
    4. 从GPS模块启动到获取第一次定位数据,可能需要比较长的时间;
  • NETWORK_PROVIDER(网络定位):

    网络定位,利用基站和WIFI节点的地址来定位,取决于将基站或WIF节点信息翻译成位置信息的服务器能力;定位快耗电低。

  • PASSIVE_PROVIDER(被动定位):

    被动定位,使用系统中其他应用的定位信息。

如果我们开发的 app 使用了定位服务,需要注意:

  1. 根据使用场景选择定位模式,优先考虑使用网络定位(比如定位城市)
  2. 前台定位时,界面 onPause 则停止位置更新;后台定位时,根据页务需求控制位置更新时间间隔。
  3. 如果应用是多模块开发,模块之间应该尽量复用位置信息,不要同时定位

WakeLock

Android 运行在很多移动设备上,考虑到功耗原因,引入了 autoSleep的休眠方式,当检测到没有唤醒源时就会进入休眠。

如果你想要保持屏幕常亮,Android推荐如下方法(当Activity或view可见时,屏幕才保持常亮),下面代码的效果是相同的:

  1. 在Activity.onCreate()中: getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
  2. 在xml布局中: android:keepScreenOn="true"
  3. 对View设置: view.setKeepScreenOn(true);

除了上述方式,我们还可以使用 Wakelock。Wakelock 是阻止系统休眠的接口,我们可以使用它保存屏幕常亮,代码如下:

val wakeLock: PowerManager.WakeLock =
    (getSystemService(Context.POWER_SERVICE) as PowerManager).run {
        newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "MyApp::MyWakelockTag").apply {
            acquire()
        }

    }

使用FLAG_KEEP_SCREEN_ON实际就是一个PowerManager.SCREEN_BRIGHT_WAKE_LOCK级别的WakeLock,它的创建和释放锁都由系统自动管理,更加方便和安全。如果我们向上面的代码一样主动使用wakeLock,一定要记得调用wakelock.release()来释放,最好的做法是要设置超时释放的时间。

还有一种PowerManager.PARTIAL_WAKE_LOCK级别的 wakelock,在这种级别下即使用户按Power键(其它级别的 wakelocks,用户按Power键,系统还是会休眠),系统也不会进入休眠,这种情况一定要特别注意。

这里还补充一下,AlarmManager内部也利用了WakeLock。它是使用系统层级的闹钟服务(持有WakeLock),用来指定时间执行任务:
1.精确的定时任务,如闹钟。
2.非精准确定时任务,可以推迟任务使多个任务同时执行而避免频繁唤醒系统
3.网络请求相关的业务不使用AlarmManager

动画

动画相关的例子可以看看《大众点评App的短视频耗电量优化实战 - 美团技术团队》,写得很好,这里就列一下需要注意的点:

  1. 动画执行需要和Activity的生命周期关联,如果Activity退出前台则需要暂停动画的执行:
  2. onPause之后暂停动画执行,减少CPU耗电;onResume重新开始动画绘制
  3. 当界面的绘制和动画比较复杂或者频繁,优先使用SurfaceView实现,SurfaceView使用单独的绘制线程,避免主线程卡顿

JobScheduler

Job Scheduler作为系统服务运行在系统层面,可以指定运行条件(充电状态、Wifi状态、设备空闲),将收到的任务在合适的时间、状态一起执行。

厂家设备对于 “灭屏 + WIFI + 充电” 的场景管控最为松散,建议可延时的任务、数据埋点上报 放到这里执行。例如:网络请求相关业务放到Job Scheduler执行、一些与特定场景(JobInfo)绑定的任务

UI绘制

UI绘制方面的优化,网上的文章很多,这里就列举一些需要注意的点:

  1. 移除不必要的background,比如window默认或嵌套的background
  2. onDraw多次重复绘制图案,使用clipRect与drawRect
  3. onDraw方法内不要new对象,避免频繁的GC
  4. 使用等优化UI布局
  5. ConstraintLayout替代RelativeLayout、LinearLayout,减少界面测量和布局的次数,优化layout开销
  6. 减少不必要的infalte,使用变量缓存减少资源加载
  7. Listview复用convertView,减少资源加载
  8. 快速滑动列表时,对于图片加载或者网络请求类,在停止滑动才加载数据
  9. clipPath可能导致CPU、GPU占用过大的问题

为了帮助到大家更好的全面清晰的掌握好性能优化,准备了相关的核心笔记(还该底层逻辑):https://qr18.cn/FVlo89

性能优化核心笔记:https://qr18.cn/FVlo89

启动优化

内存优化

UI优化

网络优化

Bitmap优化与图片压缩优化https://qr18.cn/FVlo89

多线程并发优化与数据传输效率优化

体积包优化

《Android 性能监控框架》:https://qr18.cn/FVlo89

《Android Framework学习手册》:https://qr18.cn/AQpN4J

  1. 开机Init 进程
  2. 开机启动 Zygote 进程
  3. 开机启动 SystemServer 进程
  4. Binder 驱动
  5. AMS 的启动过程
  6. PMS 的启动过程
  7. Launcher 的启动过程
  8. Android 四大组件
  9. Android 系统服务 - Input 事件的分发过程
  10. Android 底层渲染 - 屏幕刷新机制源码分析
  11. Android 源码分析实战

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/730715.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【停用词】NLP中的停用词怎么获取?我整理了6种方法

文章目录 一、停用词介绍二、停用词应用场景2.1 提取高频词2.2 词云图 三、停用词获取方法3.1 自定义停用词3.2 用wordcloud调取停用词3.3 用nltk调取停用词3.3.1 nltk中文停用词3.3.2 nltk英文停用词 3.4 用sklearn调取停用词3.5 用gensim调取停用词3.6 用spacy调取停用词 一、…

select语句与CSP模型~Go进阶

select语句 select 是 Go 中的一个控制结构。select 语句类似于 switch 语句,但是select会随机执行一个可运行的case。如果没有case可运行,它将阻塞,直到有case可运行。 语法结构 select语句的语法结构和switch语句很相似,也有…

【UGUI学习笔记】Rect Transform

文章目录 Rect Transform锚点和轴心轴心点锚点 Rect Transform 锚点和轴心 在上图中,中心位置的蓝色同心圆代表了轴心点,而四角花瓣的图形代表了实体的锚点。 Attribute含义轴心点 Pivot默认实体的几何中心处,轴心代表了对物体在空间上的坐…

安装git工具

下载安装地址: Git - Downloading Package (git-scm.com) 命令安装:创建文件夹下载路径 启动powershell 输入命令:winget install --id Git.Git -e --source winget 等待下载安装

集合面试题--ArrayList数组

介绍数组 数组(Array)是一种用连续的内存空间存储相同数据类型数据的线性数据结构。数组(Array)是一种用连续的内存空间存储相同数据类型数据的线性数据结构。 因为int占4个字节,所以也可以理解为占四块内存 数组如何…

600多个人工智能AI工具汇总,资源、教程和讲解免费提供(第二讲)

这里是600多个人工智能AI工具汇总第二讲,每天介绍5个,文章最后会告诉大家获取方式的。现在请大家同我一起进入AIGC的世界。 第一个:Leonardo.Ai,用来创造力、革新为你的创意项目生成质量的资产AI-driven速度和style-consistency。…

代码安全审计

什么是代码安全审计 代码安全审计是指有开发和安全经验的人员,通过阅读开发文档和源代码,以自动化分析工具或者人工分析为手段,对应用程序进行深入分析,高效全面的发现系统代码的编码缺陷以及开发人员不安全的编程习惯,并指导开发人员进行修复,保障应用系统的安全运行。 …

Spring Boot 中的任务调度器是什么,如何使用?

Spring Boot 中的任务调度器是什么,如何使用? 介绍 在开发企业级应用程序时,经常需要执行定时任务或周期性任务。这些任务可以包括清理临时文件,备份数据库,发送电子邮件等等。Spring Boot 提供了一个内置的任务调度…

基于STM32的homeassistant(采用FreeRTOS操作系统)【第一章:设备配网、连接服务器、断网重连、断服务器重接】

第一章开发环境: 主控STM32F103C8T6WIFI模块ESP01S开发语言C开发编译器 KEIL 组网方式WIFI服务器协议MQTT 本章要点: ESP01S的AT指令配网以及服务器连接STM32与ESP01S的usart协议通信断网重连以及断服务器重连STM32向服务器端口发送对应指令 抽象理解…

硬件电路设计--运算放大器(二)选型

文章目录 前言一、运算放大器的工艺决定Vos和Ib二、TI放大器的命名规律三、选型总结 前言 一、运算放大器的工艺决定Vos和Ib 运放的设计工艺对其各种指标有非常重要的影响 常常有三种基本工艺: Bipolar: 低输入阻抗,Ib1-100nA:Vos10-100uV,低至0.1uV/o…

惊艳!全网首份“架构师成长笔记”GitHub狂澜9000星

其实架构师是需要一个相对而言对架构师友善的环境。第一,架构师到底需要什么?一个架构师要成长,首先他需要信任,第二他需要授权,第三他需要时间,第四他需要资源,少一样都很难开展工作。如果一个…

NIO-Selector 网络编程

目录 一、阻塞 & 非阻塞 1、阻塞 2、非阻塞 二、selector 1、连接和读取 2、处理客户端断开 3、处理消息的边界 4、ByteBuffer大小分配 三、多线程优化 四、NIO vs BIO 1、stream vs channnel 2、IO模型 阻塞IO 非阻塞IO 多路复用 异步IO模型 一、阻塞 &am…

使用OpenCV检测两张图片的关键点并计算关键点的描述子

#include <iostream> #include <opencv2/core/core.hpp> #include <opencv2/features2d/features2d.hpp> #include <opencv2/highgui/highgui.hpp>

每日一博 - 探索代码世界的地图 code iris

文章目录 地址特性安装 code iris如何使用 地址 https://plugins.jetbrains.com/plugin/7324-code-iris 特性 This plugin visualizes the modules, packages and classes of your project. It’s like a UML based “Google Maps” for your Source Code. Code Iris does…

zabbix代理服务器,高可用,监控java,windows,SNMP

zabbix 一&#xff1a;代理服务器1.设置 zabbix 的下载源&#xff0c;安装 zabbix-proxy2.部署数据库&#xff0c;要求 MySQL 5.7 或 Mariadb 10.5 及以上版本2.1.初始化数据库2.2.创建数据库并指定字符集2.3.创建 zabbix 数据库用户并授权 3.导入数据库信息4.修改 zabbix-prox…

前端项目请求天地图地址报错跨域;报错418

原因是因为转义字符&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 在请求回来的地址中 给他转化一下再次请求就OK了&#xff01;

oracle 使从表中随机取出一行记录数据

select * from (select rownum no, a.* from a where status_code AVAILABLE and id_type MEM and archive_flag N and rownum<1000000 ) where no >1000000-1 for update 随机取一条&#xff0c;锁住记录&#xff0c;操作完archive_flag Y不会再取。 四种解决…

【动态规划算法】第八题:931.下降路径最小和

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法\&#x1f384; 如 果 你…

PqQt实现对数据库的添加,删除,修改(完整过程演示)

在PyQt中设置的如下的窗口&#xff1a; 其中的图标是通过新建Resource File加入的 images里面的图片可以在这里面取&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1gOgBpW7s-ZWn_5aRoaYLkQ 提取码&#xff1a;jyjy 我们把这个文件取名为res.qrc 资源文件的使用可以…

基于matlab显示城市街区场景中配备立体摄像机的无人机开发视觉SLAM算法(附源码)

一、前言 视觉SLAM是计算摄像机相对于周围环境的位置和方向&#xff0c;同时映射环境的过程。开发可视化 SLAM 算法并评估其在不同条件下的性能是一项具有挑战性的任务。最大的挑战之一是生成相机传感器的地面实况&#xff0c;尤其是在户外环境中。使用仿真可以在各种场景和相…