如何降低android应用程序的耗电量

转自:http://www.apkbus.com/forum.php?mod=viewthread&tid=5459&extra=page%3D3

如果手机(移动设备)没电了,你的程序还能运行吗?

哈哈,这是地球人都知道的问题,那么如何才能降低android应用程序的耗电量呢?今天再一次回顾了一下09年google IO大会Jeffrey Sharkey的演讲(Coding for Life — Battery Life, That Is),同时也加上自己的一些体会拿出来和大家一起分享一下。

首先我们来看看android手机的电量都主要消耗在了什么地方:

1.png

 

 

显而易见,大部分的电都消耗在了网络连接、GPS、传感器上了。

简单的说也就是主要在以下情况下耗电比较多:

1、
大数据量的传输。

2、
不停的在网络间切换。

3、
解析大量的文本数据。

那么我们怎么样来改善一下我们的程序呢?

 

1、
在需要网络连接的程序中,首先检查网络连接是否正常,如果没有网络连接,那么就不需要执行相应的程序。

检查网络连接的方法如下:

 

  1. ConnectivityManager mConnectivity;
  2. TelephonyManager mTelephony;
  3. ……
  4. // 检查网络连接,如果无网络可用,就不需要进行连网操作等
  5. NetworkInfo info = mConnectivity.getActiveNetworkInfo();
  6. if (info == null ||
  7.         !mConnectivity.getBackgroundDataSetting()) {
  8.                 return false;
  9. }
  10. //判断网络连接类型,只有在3G或wifi里进行一些数据更新。
  11. int netType = info.getType();
  12. int netSubtype = info.getSubtype();
  13. if (netType == ConnectivityManager.TYPE_WIFI) {
  14.     return info.isConnected();
  15. } else if (netType == ConnectivityManager.TYPE_MOBILE
  16.         && netSubtype == TelephonyManager.NETWORK_TYPE_UMTS
  17.         && !mTelephony.isNetworkRoaming()) {
  18.     return info.isConnected();
  19. } else {
  20.     return false;
  21. }
复制代码

2、
使用效率高的数据格式和解析方法。通过测试发现,目前主流的数据格式,使用树形解析(如DOM)和流的方式解析(SAX)对比情况如下图所示: 2.png

很明显,使用流的方式解析效率要高一些,因为DOM解析是在对整个文档读取完后,再根据节点层次等再组织起来。而流的方式是边读取数据边解析,数据读取完后,解析也就完毕了。在数据格式方面,JSON和Protobuf效率明显比XML好很多,XML和JSON大家都很熟悉,Protobuf是google提出的,一种语言无关、平台无关、扩展性好的用于通信协议、数据存储的结构化数据串行化方法。有兴趣的可以到官方去看看更多的信息http://code.google.com/p/protobuf/。从上面的图中我们可以得出结论就是尽量使用SAX等边读取边解析的方式来解析数据,针对移动设备,最好能使用JSON之类的轻量级数据格式为佳。3、
目前大部门网站都支持GZIP压缩,所以在进行大数据量下载时,尽量使用GZIP方式下载。使用方法如下所示:

  1. import java.util.zip.GZIPInputStream;
  2. HttpGet request =
  3.     new HttpGet("http://example.com/gzipcontent");
  4. HttpResponse resp =
  5.     new DefaultHttpClient().execute(request);
  6. HttpEntity entity = response.getEntity();
  7. InputStream compressed = entity.getContent();
  8. InputStream rawData = new GZIPInputStream(compressed);
复制代码

使用GZIP压缩方式下载数据,能减少网络流量,下图为使用GZIP方式获取包含1800个主题的RSS对比情况。 3.png

4、
其它一些优化方法:回收java对象,特别是较大的java对像XmlPullParserFactory and BitmapFactory Matcher.reset(newString) for regexStringBuilder.sentLength(0)对定位要求不是太高的话尽量不要使用GPS定位,可能使用wifi和移动网络cell定位即可。GPS定位消耗的电量远远高于移动网络定位。尽量不要使用浮点运算。获取屏幕尺寸等信息可以使用缓存技术,不需要进行多次请求。很多人开发的程序后台都会一个service不停的去服务器上更新数据,在不更新数据的时候就让它sleep,这种方式是非常耗电的,通常情况下,我们可以使用AlarmManager来定时启动服务。如下所示,第30分钟执行一次。

  1. AlarmManager am = (AlarmManager)
  2.         context.getSystemService(Context.ALARM_SERVICE);
  3. Intent intent = new Intent(context, MyService.class);
  4. PendingIntent pendingIntent =
  5.         PendingIntent.getService(context, 0, intent, 0);
  6. long interval = DateUtils.MINUTE_IN_MILLIS * 30;
  7. long firstWake = System.currentTimeMillis() + interval;
  8. am.setRepeating(AlarmManager.RTC,firstWake, interval, pendingIntent);
复制代码

最后一招,在运行你的程序前先检查电量,电量太低,那么就提示用户充电之类的,哈哈!使用方法:

  1. public void onCreate() {
  2.     // Register for sticky broadcast and send default
  3.     registerReceiver(mReceiver, mFilter);
  4.     mHandler.sendEmptyMessageDelayed(MSG_BATT, 1000);
  5. }
  6. IntentFilter mFilter =
  7.         new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
  8. BroadcastReceiver mReceiver = new BroadcastReceiver() {
  9.     public void onReceive(Context context, Intent intent) {
  10.         // Found sticky broadcast, so trigger update
  11.         unregisterReceiver(mReceiver);
  12.         mHandler.removeMessages(MSG_BATT);
  13.         mHandler.obtainMessage(MSG_BATT, intent).sendToTarget();
  14.     }
  15. };
复制代码


困了,睡觉了,想了解更多内容,请直接查看google IO 2009相关文档:http://code.google.com/events/io/2009/sessions/CodingLifeBatteryLife.html

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IOS耗电量测试(一)耗电量数据获取

转载:https://blog.csdn.net/redcard0/article/details/89030124 随着游戏越来越重度,游戏耗电太高造成游戏发烫的投诉量已经仅次于帧率,高于针对内存崩溃的投诉。优化的前提是耗电量数据可以度量,本文主要阐述耗电量数据如何获取…

APP专项测试之耗电量测试

一、耗电量测试分析 相对于PC端来说,移动设备的电池电量是非常有限的,保持持久的续航能力尤为重要。Android的很多特性都比较耗电(如屏幕、GPS、sensor传感器、唤醒机制、CPU、连网等的使用),我们必须要慎重检查APP的…

如何测试Android APP的耗电量?

现在可以使用google提供的battery-historian来测试,适用条件:5.0及以上手机。 battery-historian链接:google/battery-historian android吧 所以的android都自带的功能 设置--->电池/电源管理/ MQC在兼容性测试、功能测试、稳定性测试中都…

app耗电量测试

目录 目录 1. 引言 2. 测试方法 2.1. 直接观察 2.2. 使用adb命令进行统计 3. 典型的耗电场景 3.1. 定位 3.2. 网络传输 3.3. 音视频播放 4. app电量分析工具 4.1. Batterystats 4.2. Battery Historian 5. 环境安装 5.1. adb命令 5.2. 安装go 5.3. 安装git 5.4…

盘点COVID-19新冠药物和疫苗研发进展

COVID-19是由严重急性呼吸系统综合症冠状病毒2(SARS-CoV-2)引起的一种传染病,这是一种单股正链RNAβ冠状病毒,它是Beta-CoV谱系B( Sarbecovirus亚属)。 COVID-19代表着全球健康威胁,并且是可能引…

药物临床试验数据递交FDA的规定

信息来源: https://www.fda.gov/industry/fda-data-standards-advisory-board/study-data-standards-resources STUDY DATA TECHNICAL CONFORMANCE GUIDE v4.9 (March 2022) (研究数据技术一致性指南) 仅提取该文档中的部分内容加以翻译,以下中文都是…

姜敬哲/孙燕妮/原丽红合作开发可用于病毒快速分类的工具PhaGCN2

南海水产研究所姜敬哲团队、香港城市大学孙燕妮团队、广东药科大学原丽红合作开发的可用于病毒快速分类生信工具 使用PhaGCN2对病毒基因组片段分类 Virus classification for viral genomic fragments using PhaGCN2 文章链接:https://www.researchsquare.com/artic…

多组学在药物机制解析和诊断标志物开发中的应用

链接:多组学在药物机制解析和诊断标志物开发中的应用_哔哩哔哩_bilibili 药物研发流程和多组学前沿技术 药物研发流程遇到的挑战 流程:新药的发现——临床前研究——临床研究 挑战: 诊断是否清晰、机制是否明确、靶点是否可靠、药物是否有…

药物研发早期预测细胞毒性的解决方案

药物从设计到上市的整个研究阶段,毒性通常是导致研发失败的最主要原因。即使上市以后还有许多药物由于出现研发阶段未能发现的毒性而被撤市或严格限制使用。因此,如何及时、准确、快速地评价药物毒性便成为药物开发中的一个重要问题。 在体外快速的、高…

针对新冠病毒,盛普始终坚持多靶标协同的防治病毒药物研发

全球范围内的新冠确诊人数仍旧在增加,“特效治疗药”依然没有找到。凛冬已至,更适于病毒传播的寒冷高湿天气已经笼罩了半个地球。在一片阴霾的疫情当中,“希望之光”开始浮现,新冠疫苗和单一靶标的小分子药物开始被世界各国政府应急准入市场。这些疫苗和小分子药物依靠海量…

3CLpro蛋白酶抑制剂,如何靠实力进入新冠病毒诊疗方案

3月15日,国家卫健委发布《新型冠状病毒肺炎诊疗方案(试行第九版)》,在抗病毒治疗中,抗新冠病毒药物PF-07321332/利托那韦片(Paxlovid)被写入诊疗方案。Paxlovid是由两种抗病毒药物组成&#xff…

关于CV算法岗就业相关问题,精华回答分享

粉丝提问: 你好,看星球上做前端,后端,java 的人比较多,好像没有看到有多少人做算法,我现在已经毕业了,是一名 cv 算法工程师,但是我现在很苦恼,感觉自己代码能力很弱&am…

chatgpt赋能python:Python自动打开软件:实现轻松便捷的操作

Python自动打开软件:实现轻松便捷的操作 在许多工作场所,我们可能需要反复打开某个软件,费时费力。那么有没有一种方式能够轻松地自动打开特定软件呢?此时Python便是一个好帮手。PythonとWINDOWS关联性较强,可以方便地…

Golang/Python 调用 openAI 的API 详解

学习目标: OpenAI API介绍 学习如何通过 Golang 使用 OpenAI 的 API OpenAI 的常用的参数及其说明 了解OpenAI API 中令牌(tokens) OpenAI API 提供了几个不同的终端点(endpoints)和模式(modes) 复杂和…

我改了一行公共代码后,同事说要建个没我的小群

点击上方 前端Q,关注公众号 回复加群,加入前端Q技术交流群 嗨,大家好!这里是道长王jj~ 🎩🧙‍♂️ 今天我想和大家分享一个惨痛的教训,就是当我一意孤行地删掉一个看起来没用的配置文件时&#…

chatgpt赋能python:免费的Python教程:从入门到精通

免费的Python教程:从入门到精通 Python是如今最热门的编程语言之一,在众多编程语言中占据了重要的地位。Python有着简单易学的语法,充足的库支持,高效的执行速度和海量的社区支持,这些使得Python成为最适合初学者的编…

chatgpt赋能python:Python报错Module:从入门到精通

Python报错Module:从入门到精通 在Python编程中,我们经常会遇到各种各样的错误。其中,Module错误是最常见的一种。在这篇文章中,我们将深入探讨Python报错Module的各种原因和解决方法,并希望能够帮助那些遇到这种问题…

chatgpt赋能python:Python词汇大全:从入门到精通

Python词汇大全:从入门到精通 Python作为一门简洁易学的编程语言,已经成为了全球程序员的热门选择。在这篇文章中,我们将介绍Python的词汇大全,包括关键字、数据类型、内建函数、标准库、第三方库等内容,帮助读者更好…