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的变化后再执行下载任务。

目录
相关文章
|
3月前
|
移动开发 监控 前端开发
构建高效Android应用:从优化布局到提升性能
【7月更文挑战第60天】在移动开发领域,一个流畅且响应迅速的应用程序是用户留存的关键。针对Android平台,开发者面临的挑战包括多样化的设备兼容性和性能优化。本文将深入探讨如何通过改进布局设计、内存管理和多线程处理来构建高效的Android应用。我们将剖析布局优化的细节,并讨论最新的Android性能提升策略,以帮助开发者创建更快速、更流畅的用户体验。
67 10
|
4月前
|
Java Android开发
Android面试题经典之Glide取消加载以及线程池优化
Glide通过生命周期管理在`onStop`时暂停请求,`onDestroy`时取消请求,减少资源浪费。在`EngineJob`和`DecodeJob`中使用`cancel`方法标记任务并中断数据获取。当网络请求被取消时,`HttpUrlFetcher`的`cancel`方法设置标志,之后的数据获取会返回`null`,中断加载流程。Glide还使用定制的线程池,如AnimationExecutor、diskCacheExecutor、sourceExecutor和newUnlimitedSourceExecutor,其中某些禁止网络访问,并根据CPU核心数动态调整线程数。
146 2
|
2月前
|
存储 缓存 编解码
Android经典面试题之图片Bitmap怎么做优化
本文介绍了图片相关的内存优化方法,包括分辨率适配、图片压缩与缓存。文中详细讲解了如何根据不同分辨率放置图片资源,避免图片拉伸变形;并通过示例代码展示了使用`BitmapFactory.Options`进行图片压缩的具体步骤。此外,还介绍了Glide等第三方库如何利用LRU算法实现高效图片缓存。
67 20
Android经典面试题之图片Bitmap怎么做优化
|
1月前
|
调度 Android开发 开发者
构建高效Android应用:探究Kotlin多线程优化策略
【10月更文挑战第11天】本文探讨了如何在Kotlin中实现高效的多线程方案,特别是在Android应用开发中。通过介绍Kotlin协程的基础知识、异步数据加载的实际案例,以及合理使用不同调度器的方法,帮助开发者提升应用性能和用户体验。
49 4
|
22天前
|
安全 Android开发 iOS开发
深入探索iOS与Android系统的差异性及优化策略
在当今数字化时代,移动操作系统的竞争尤为激烈,其中iOS和Android作为市场上的两大巨头,各自拥有庞大的用户基础和独特的技术特点。本文旨在通过对比分析iOS与Android的核心差异,探讨各自的优势与局限,并提出针对性的优化策略,以期为用户提供更优质的使用体验和为开发者提供有价值的参考。
|
2月前
|
Java Android开发 UED
安卓应用开发中的内存管理优化技巧
在安卓开发的广阔天地里,内存管理是一块让开发者既爱又恨的领域。它如同一位严苛的考官,时刻考验着开发者的智慧与耐心。然而,只要我们掌握了正确的优化技巧,就能够驯服这位考官,让我们的应用在性能和用户体验上更上一层楼。本文将带你走进内存管理的迷宫,用通俗易懂的语言解读那些看似复杂的优化策略,让你的开发之路更加顺畅。
64 2
|
2月前
|
Java Android开发 开发者
安卓应用开发中的线程管理优化技巧
【9月更文挑战第10天】在安卓开发的海洋里,线程管理犹如航行的风帆,掌握好它,能让应用乘风破浪,反之则可能遭遇性能的暗礁。本文将通过浅显易懂的语言和生动的比喻,带你探索如何优雅地处理安卓中的线程问题,从基础的线程创建到高级的线程池运用,让你的应用运行更加流畅。
|
3月前
|
Ubuntu Android开发
安卓系统调试与优化:(一)bootchart 的配置和使用
本文介绍了如何在安卓系统中配置和使用bootchart工具来分析系统启动时间,包括安装工具、设备端启用bootchart、PC端解析数据及分析结果的详细步骤。
197 0
安卓系统调试与优化:(一)bootchart 的配置和使用
|
2月前
|
监控 算法 数据可视化
深入解析Android应用开发中的高效内存管理策略在移动应用开发领域,Android平台因其开放性和灵活性备受开发者青睐。然而,随之而来的是内存管理的复杂性,这对开发者提出了更高的要求。高效的内存管理不仅能够提升应用的性能,还能有效避免因内存泄漏导致的应用崩溃。本文将探讨Android应用开发中的内存管理问题,并提供一系列实用的优化策略,帮助开发者打造更稳定、更高效的应用。
在Android开发中,内存管理是一个绕不开的话题。良好的内存管理机制不仅可以提高应用的运行效率,还能有效预防内存泄漏和过度消耗,从而延长电池寿命并提升用户体验。本文从Android内存管理的基本原理出发,详细讨论了几种常见的内存管理技巧,包括内存泄漏的检测与修复、内存分配与回收的优化方法,以及如何通过合理的编程习惯减少内存开销。通过对这些内容的阐述,旨在为Android开发者提供一套系统化的内存优化指南,助力开发出更加流畅稳定的应用。
73 0
|
3月前
|
调度 Android开发 开发者
【颠覆传统!】Kotlin协程魔法:解锁Android应用极速体验,带你领略多线程优化的无限魅力!
【8月更文挑战第12天】多线程对现代Android应用至关重要,能显著提升性能与体验。本文探讨Kotlin中的高效多线程实践。首先,理解主线程(UI线程)的角色,避免阻塞它。Kotlin协程作为轻量级线程,简化异步编程。示例展示了如何使用`kotlinx.coroutines`库创建协程,执行后台任务而不影响UI。此外,通过协程与Retrofit结合,实现了网络数据的异步加载,并安全地更新UI。协程不仅提高代码可读性,还能确保程序高效运行,不阻塞主线程,是构建高性能Android应用的关键。
62 4
下一篇
无影云桌面