Android 耗电优化

简介:

一、 监视电量的变化和充电状态

当你通过降低后台任务的更新频率来降低其对电量的影响时,检测当前的电量和充电状态都是一个好的开始好的尝试。

应用的更新对电量的影响最好由剩余电量和充电状态决定。充电时,应用的更新操作对电量的影响可以忽略不计,此时你应该最大化你的刷新频率。相反的没有充电时,降低你应用的更新操作频率来延迟电量使用时间。

相似的你可以检测电量的变化,当电量临近耗尽时,要降低应用更新频率甚至停止应用。

1. 确定当前充电状态:

BatteryManager广播多有的电量和充电信息详情到Intent里。你不需要注册一个BroadcastReceiver,只要简单的调用registerReceiver()并传递一个null作为receiver即可,当前的电量状态信息intent会立刻返回(当然你也可以传递一个BroadcastReceiver对象)。

IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);

Intent batteryStatus = context.registerReceiver(null, ifilter);

你可以检测当前的充电状态,是通过USB方式充电还是插入充电器充电:

// Are we charging / charged?

int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);

boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||

status == BatteryManager.BATTERY_STATUS_FULL;

// How are we charging?

int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);

boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;

boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;

通常你可以在链接充电器充电时最大化后台更新的频率,链接USB时减低更新频率,没有连接充电时再降低更新频率。

2. 监视充电状态变化

由于充电状态的变化即为容易,根据充电状态的变化决定你应用后台更新的频率变得尤为重要。无论链接或者端口充电设备BatteryManager都会广播一个action,无论你的应用是否运行,能够接受到这个广播都非常重要,尤其是广播会影响你应用的启动来执行后台任务的场景。所有,你需要注册一个BroadcastReceiver到manifest来监听ACTION_POWER_CONNECTED和ACTION_POWER_DISCONNECTED:

<receiver android:name=".PowerConnectionReceiver">

<intent-filter>

<action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>

<action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>

</intent-filter>

</receiver>

在你的BroadcastReveiver实现里,你可以向前面介绍的方法那样检测电量变化和充电状态变化的信息。

3. 确定当前的剩余电量

确定当前的剩余电量在很多时候也非常有用,在电量耗费到某个水平时你需要降低后台的更新频率。电量的获取也是通过电量信息的intent得到,保护使用电量和电量总容量:

int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);

int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1);

float batteryPct = level / (float)scale;

4. 监视电量的变化情况

你不可以一直保持对电量变化的监视,你也不需要这样作!通常来说,持续的保持对电量变化的监控对电量产生的耗费比你的应用的普通内部工作耗费的电还要多。所以监视电量使用的特殊状态是一个好的尝试,尤其是进入或者退出低电量这两个状态。你可以通过注册监听ACTION_BATTERY_LOW和ACTION_BATTERY_OKAY两个状态的receiver来实现。

二、 检测并监控手机的停靠状态和类型

Android设备可以有几种停靠状态,如车在模式、家庭模式等。停靠模式通常直接和充电状态相关,很多停靠模式提供充电和固定设备。停靠模式对你的应用产生什么影响由你自己决定,如可以在桌面停靠时增加更新频率、车载停靠模式时停止刷新,可以在车载停靠模式时最大频率的更新交通流量信息。类似的,停靠状态也是同个Intent广播的,可以通过查询或者注册的方式得到。

查询当前的停靠状态:

IntentFilter ifilter = new IntentFilter(Intent.ACTION_DOCK_EVENT);

Intent dockStatus = context.registerReceiver(null, ifilter);

int dockState = battery.getIntExtra(EXTRA_DOCK_STATE, -1);

boolean isDocked = dockState != Intent.EXTRA_DOCK_STATE_UNDOCKED;

查询当前的停靠类型:

boolean isCar = dockState == EXTRA_DOCK_STATE_CAR;

boolean isDesk = dockState == EXTRA_DOCK_STATE_DESK ||

dockState == EXTRA_DOCK_STATE_LE_DESK ||

dockState == EXTRA_DOCK_STATE_HE_DESK;

监视停靠状态的变化:

<action android:name="android.intent.action.ACTION_DOCK_EVENT"/>

三、 检测并监视手机的联网状态

重复的alarms定时广播和后台的service是非常常见的用法,用来执行定时从internet资源更新应用数据、缓存数据、或者执行长时间的下载任务。但是如果手机没有连接到internet时或者连接的速度非常缓慢导致下载特别慢时,此时不应该保存设备唤醒或者继续执行更新。可以使用ConnectivityManager检测是否连接到internet以及通过什么样的连接方式。

没有联网的时候没有必要在执行基于internet的更新或者下载任务,可以通过如下方式检测:

onnectivityManager cm =

(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);

NetworkInfo activeNetwork = cm.getActiveNetworkInfo();

boolean isConnected = activeNetwork != null &&

activeNetwork.isConnectedOrConnecting();

设备的链接状态包括移动网络、ViMAX、Wi-Fi、以太网连接,不同的链接方式提供了不同的带宽和耗电量。可以通过如下方式获取类型:

boolean isWiFi = activeNetwork.getType() == ConnectivityManager.TYPE_WIFI;

移动网络耗费明显高于Wi-Fi,大多数时候需要在移动网络时降低更新频率,一些工作甚至要等待Wi-Fi环境才能启动执行。

监视网络变化:ConnectivityManager会在任何连接网络变化的时候广播android.net.connn.CONNECTIVITY_ACTION,可以通过注册监听器receiver监听:

<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>

四、 控制广播接收的需求

最简单的监听设备状态变化的方式就是注册receiver到manifest来监听响应的状态。通常你会根据设备状态在每个receiver里你会重置定时广播。一个直接的影响就是:每一次广播后你的设备都要被唤醒,潜在的可能超过了本来需要的频率。一个更好的方式是在执行阶段通过代码控制是否启动监听receiver。

可以使用PackageManager来切换manifest里定义的组件的可用不可用状态。例如:

ComponentName receiver = new ComponentName(context, myReceiver.class);

PackageManager pm = context.getPackageManager();

pm.setComponentEnabledSetting(receiver,

PackageManager.COMPONENT_ENABLED_STATE_ENABLED,

PackageManager.DONT_KILL_APP)

通过这种技术,在手机未联网时,你可以停止所有的receiver除了监听网络变化的receiver。相反的,当你的手机联网后你可以停止对联网的监听,在执行网络操作前简单的检查网络连接性。可以使用同样的技术来延迟需要高带宽的下载任务的执行,监听到连接Wi-Fi的变化后再执行下载任务。

目录
相关文章
|
11天前
|
Java 数据库 Android开发
【专栏】构建高效 Android 应用:探究 Kotlin 多线程优化策略
【4月更文挑战第27天】本文探讨了Kotlin在Android开发中的多线程优化,包括线程池、协程的使用,任务分解、避免阻塞操作以及资源管理。通过案例分析展示了网络请求、图像处理和数据库操作的优化实践。同时,文章指出并发编程的挑战,如性能评估、调试及兼容性问题,并强调了多线程优化对提升应用性能的重要性。开发者应持续学习和探索新的优化策略,以适应移动应用市场的竞争需求。
|
15天前
|
缓存 监控 Android开发
构建高效Android应用:从优化用户体验到提升性能表现
【4月更文挑战第23天】 在竞争激烈的移动市场中,一个高效的Android应用是吸引并保留用户的关键。本文将探讨如何通过一系列技术手段和最佳实践来优化Android应用的用户体验和性能表现。我们将深入分析响应式UI设计、内存管理、多线程处理以及最新的Android框架特性,揭示它们如何共同作用以减少应用延迟,提高响应速度,并最终提升整体用户满意度。
|
17天前
|
缓存 API Android开发
Android 应用优化策略:提升性能与用户体验
【4月更文挑战第21天】在移动应用开发领域,性能优化是一个持续的挑战。尤其对于Android平台,由于设备多样性和系统版本的碎片化,开发者需要采取多种策略确保应用流畅运行并给用户带来良好体验。本文将深入探讨针对Android应用的性能优化技巧,包括内存管理、UI渲染效率提升、多线程应用以及电池寿命优化等方面。这些建议旨在帮助开发者诊断和改进现有应用,或在开发新项目时提前考虑到性能因素。
|
18天前
|
API 数据库 Android开发
构建高效Android应用:探究Kotlin协程的优化实践
【4月更文挑战第20天】 在现代Android开发中,Kotlin协程以其轻量级线程管理和非阻塞I/O操作的优势成为提升应用性能和响应性的重要工具。本文深入分析Kotlin协程的核心原理,探讨其在Android平台上实现高效并发编程的方法,并通过具体实例演示如何利用协程改进应用架构。我们将从协程的基本概念出发,逐步解析其与线程、回调和异步任务的关系,最终展示如何通过协程简化代码结构,提高运行效率,并确保用户界面的流畅性。
21 11
|
29天前
|
缓存 测试技术 Android开发
深入探究Android中的自定义View绘制优化策略
【4月更文挑战第8天】 在Android开发实践中,自定义View的绘制性能至关重要,尤其是当涉及到复杂图形和动画时。本文将探讨几种提高自定义View绘制效率的策略,包括合理使用硬件加速、减少不必要的绘制区域以及利用缓存机制等。这些方法不仅能改善用户体验,还能提升应用的整体性能表现。通过实例分析和性能测试结果,我们将展示如何有效地实现这些优化措施,并为开发者提供实用的技术指南。
|
8天前
|
缓存 监控 API
Android应用性能优化实践
【4月更文挑战第30天】 随着智能手机的普及,用户对移动应用的性能要求越来越高。对于Android开发者而言,提升应用的性能是吸引和保留用户的关键因素之一。本文将深入探讨影响Android应用性能的主要因素,并提供一系列的优化策略,旨在帮助开发者构建更加流畅和高效的应用体验。
|
8天前
|
移动开发 调度 Android开发
构建高效Android应用:Kotlin协程的实践与优化
【4月更文挑战第30天】在移动开发领域,性能和响应性是衡量应用质量的关键指标。对于Android平台而言,Kotlin协程作为一种新兴的异步编程解决方案,提供了更为简洁和高效的处理并发任务的能力。本文将深入探讨Kotlin协程的核心原理,以及如何通过它们来提升Android应用的性能。我们将从基础概念出发,逐步介绍协程的创建、管理以及与Android UI线程的交互,并最终展示如何优化现有代码以利用协程的优势。
|
9天前
|
移动开发 数据库 Android开发
构建高效Android应用:探究Kotlin协程的优化实践
【4月更文挑战第29天】在移动开发领域,尤其是Android平台上,性能优化一直是开发者关注的重点。近年来,Kotlin语言凭借其简洁性和功能性成为Android开发的热门选择。其中,Kotlin协程作为一种轻量级的并发处理机制,为编写异步代码、网络请求和数据库操作提供了极大的便利。本文将深入探讨Kotlin协程在Android应用中的性能优化技巧,帮助开发者构建更加高效的应用程序。
|
9天前
|
移动开发 API Android开发
Android应用性能优化实战
【4月更文挑战第28天】在移动开发领域,一个流畅的用户体验是至关重要的。对于Android开发者而言,应用的性能优化是一项既挑战性也极其重要的工作。本文将深入探讨Android应用性能优化的多个方面,包括内存管理、UI渲染、多线程处理以及电池效率等,旨在为开发者提供实用的性能提升策略和具体的实施步骤。通过分析常见的性能瓶颈,并结合最新的Android系统特性和工具,我们的目标是帮助读者打造更加高效、响应迅速的Android应用。
|
11天前
|
缓存 监控 Android开发
Android 应用性能优化实战
【4月更文挑战第27天】 在竞争激烈的移动应用市场中,性能优越的应用更能吸引和保留用户。针对Android平台,本文将深入探讨影响应用性能的关键因素,并提供一系列实用的优化策略。我们将从内存管理、UI渲染、多线程处理以及电池使用效率等方面入手,通过具体案例分析如何诊断常见问题,并给出相应的解决方案。文中所提技巧旨在帮助开发者构建更加流畅、高效的Android应用。
23 2