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

目录
相关文章
|
26天前
|
缓存 监控 Java
构建高效Android应用:从优化用户体验到提升性能
在竞争激烈的移动应用市场中,为用户提供流畅和高效的体验是至关重要的。本文深入探讨了如何通过多种技术手段来优化Android应用的性能,包括UI响应性、内存管理和多线程处理。同时,我们还将讨论如何利用最新的Android框架和工具来诊断和解决性能瓶颈。通过实例分析和最佳实践,读者将能够理解并实施必要的优化策略,以确保他们的应用在保持响应迅速的同时,还能够有效地利用系统资源。
|
1月前
|
调度 数据库 Android开发
构建高效Android应用:Kotlin协程的实践与优化
在Android开发领域,Kotlin以其简洁的语法和平台友好性成为了开发的首选语言。其中,Kotlin协程作为处理异步任务的强大工具,它通过提供轻量级的线程管理机制,使得开发者能够在不阻塞主线程的情况下执行后台任务,从而提升应用性能和用户体验。本文将深入探讨Kotlin协程的核心概念,并通过实例演示如何在实际的Android应用中有效地使用协程进行网络请求、数据库操作以及UI的流畅更新。同时,我们还将讨论协程的调试技巧和常见问题的解决方法,以帮助开发者避免常见的陷阱,构建更加健壮和高效的Android应用。
36 4
|
1月前
|
数据库 Android开发 开发者
构建高效Android应用:采用Kotlin协程优化网络请求处理
【2月更文挑战第30天】 在移动应用开发领域,网络请求的处理是影响用户体验的关键环节。针对Android平台,利用Kotlin协程能够极大提升异步任务处理的效率和简洁性。本文将探讨如何通过Kotlin协程优化Android应用中的网络请求处理流程,包括协程的基本概念、网络请求的异步执行以及错误处理等方面,旨在帮助开发者构建更加流畅和响应迅速的Android应用。
|
1月前
|
API 数据库 Android开发
构建高效Android应用:探究Kotlin多线程优化策略
【2月更文挑战第14天】随着移动设备性能的日益强大,用户对应用程序的响应速度和流畅性要求越来越高。在Android开发中,合理利用多线程技术是提升应用性能的关键手段之一。Kotlin作为一种现代的编程语言,其协程特性为开发者提供了更为简洁高效的多线程处理方式。本文将深入探讨使用Kotlin进行Android多线程编程的最佳实践,包括协程的基本概念、优势以及在实际项目中的应用场景和性能优化技巧,旨在帮助开发者构建更加高效稳定的Android应用。
|
2月前
|
搜索推荐 安全 Android开发
如何优化安卓应用的用户体验
【2月更文挑战第9天】在当今移动互联网时代,安卓应用已成为人们日常生活中不可或缺的一部分。然而,用户对应用的使用体验越来越苛刻,一个不好的应用体验很容易导致用户的流失。本文将介绍如何从多个方面优化安卓应用的用户体验。
|
6月前
|
JSON JavaScript 前端开发
Android 缩减、混淆处理和优化应用研究(二)
Android 缩减、混淆处理和优化应用研究(二)
|
24天前
|
Java Android开发 开发者
构建高效Android应用:Kotlin协程的实践与优化
在响应式编程范式日益盛行的今天,Kotlin协程作为一种轻量级的线程管理解决方案,为Android开发带来了性能和效率的双重提升。本文旨在探讨Kotlin协程的核心概念、实践方法及其在Android应用中的优化策略,帮助开发者构建更加流畅和高效的应用程序。通过深入分析协程的原理与应用场景,结合实际案例,本文将指导读者如何优雅地解决异步任务处理,避免阻塞UI线程,从而优化用户体验。
|
1天前
|
移动开发 Java Android开发
构建高效Android应用:采用Kotlin协程优化网络请求
【4月更文挑战第24天】 在移动开发领域,尤其是对于Android平台而言,网络请求是一个不可或缺的功能。然而,随着用户对应用响应速度和稳定性要求的不断提高,传统的异步处理方式如回调地狱和RxJava已逐渐显示出局限性。本文将探讨如何利用Kotlin协程来简化异步代码,提升网络请求的效率和可读性。我们将深入分析协程的原理,并通过一个实际案例展示如何在Android应用中集成和优化网络请求。
|
7天前
|
缓存 移动开发 Android开发
构建高效Android应用:从优化用户体验到提升性能表现
【4月更文挑战第18天】 在移动开发的世界中,打造一个既快速又流畅的Android应用并非易事。本文深入探讨了如何通过一系列创新的技术策略来提升应用性能和用户体验。我们将从用户界面(UI)设计的简约性原则出发,探索响应式布局和Material Design的实践,再深入剖析后台任务处理、内存管理和电池寿命优化的技巧。此外,文中还将讨论最新的Android Jetpack组件如何帮助开发者更高效地构建高质量的应用。此内容不仅适合经验丰富的开发者深化理解,也适合初学者构建起对Android高效开发的基础认识。
5 0
|
13天前
|
存储 数据库 Android开发
构建高效安卓应用:采用Jetpack架构组件优化用户体验
【4月更文挑战第12天】 在当今快速发展的数字时代,Android 应用程序的流畅性与响应速度对用户满意度至关重要。为提高应用性能并降低维护成本,开发者需寻求先进的技术解决方案。本文将探讨如何利用 Android Jetpack 中的架构组件 — 如 LiveData、ViewModel 和 Room — 来构建高质量的安卓应用。通过具体实施案例分析,我们将展示这些组件如何协同工作以实现数据持久化、界面与逻辑分离,以及确保数据的即时更新,从而优化用户体验并提升应用的可维护性和可测试性。