Android官方开发文档Training系列课程中文版:管理设备的睡眠状态

原文地址:http://android.xsoftlab.net/training/scheduling/index.html

引言

当Android设备处于闲置状态时,它的屏幕首先会变暗,接着会关闭屏幕,最后会将CPU关闭。这些举措可以防止设备的电量迅速被耗尽。但是当APP需要的话,还是会有例外情况:

  • 游戏类APP或者视频类APP需要保持屏幕常亮。
  • 有一部分APP或许不需要屏幕保持常亮,但是它们需要CPU继续保持运转,直到它们的任务执行完毕。

这节课主要学习如何在需要的时候保持设备的唤醒状态而又不至于非常耗电。

保持设备的唤醒状态

为了避免迅速将电量耗光,Android设备会在进入闲置状态后紧接着进入睡眠状态。不过,还是有一些例外情况的:它们需要保持屏幕常亮或者是保持CPU持续运转状态以便完成某些任务。

具体采用什么样的方式这取决于APP的需求。不过,有一条规则就是尽量采取最轻量级的方法,尽可能少的消耗系统资源。

保持屏幕常亮

某些APP比如游戏类APP或者视频类APP需要保持屏幕常亮。要做到这一点只需要在Activity中使用FLAG_KEEP_SCREEN_ON就可以,不过千万不要在服务或者其它组件中使用该标志:

public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);}...
}

这种方法的优势在于:它不要指定特殊权限,系统会将APP之间的状态切换处理好,也不需要担心有关释放无用资源的问题。

另一个实现方式就是在布局文件中使用android:keepScreenOn属性:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:keepScreenOn="true">...
</RelativeLayout>

android:keepScreenOn=”true”的作用效果与使用FLAG_KEEP_SCREEN_ON的效果等同。你可以选择最合适的方式。使用标志的优势在于可以动态的清除该标志的状态,以便于屏幕可以转入关闭状态。

Note: 除非可以肯定屏幕不再需要保持常亮,否则不需要我们自己专门去清除该标志。WindowManager会严格把关这些事情:APP转入后台时,APP转入前台时。但是如果你明确要清除该标志以便屏幕可以转入关闭状态,那么可以使用clearFlags():getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)

保持CPU的运行

如果APP希望在系统转入睡眠状态之前完成一些事情,那么可以使用PowerManager系统服务中的WakeLock特性。WakeLock可以使APP控制设备的电源状态。

因为持有WakeLock对象可以直接与电源交互,所以只能在必要的时候使用WakeLock。绝不要在Activity中使用WakeLock。就像上面说的那样,如果希望保持屏幕常亮,只需要使用FLAG_KEEP_SCREEN_ON就可以。

使用WakeLock的合理场景就是后台服务。再强调一次,使用时应当以最小限度使用该标志,因为它会直接影响到电池的电量。

如果要使用WakeLock,首先需要在清单文件中添加WakeLock的权限:

<uses-permission android:name="android.permission.WAKE_LOCK" />

如果APP还包括了一个与服务做相关工作的广播接收器,那么可以通过WakefulBroadcastReceiver来管理WakeLock。这是一种非常理想的方案。如果APP没有那样的情况,那么也可以使用下面的方法:

PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
Wakelock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,"MyWakelockTag");
wakeLock.acquire();

如果要释放WakeLock,调用wakelock.release()就好。它会释放你所持有的CPU资源。在任务完成后做这项工作是很重要的,因为这可以防止电池电量被迅速耗光。

使用WakefulBroadcastReceiver

广播接收器与服务的结合使用非常易于管理后台任务的生命周期。

WakefulBroadcastReceiver是一种特殊的广播接收器:它可以创建并管理APP的PARTIAL_WAKE_LOCK。在设备即将转入睡眠状态时,WakefulBroadcastReceiver会将该信号发给服务(通常是IntentService)。如果在收到广播后没有持有WakeLock,那么可以在工作完成之前设备就会转入睡眠状态。这就会导致任务不能及时完成,这并不是我们想看到的。

WakefulBroadcastReceiver用法的第一步就是将其添加到清单文件中,与其它广播接收器的添加方式一样:

<receiver android:name=".MyWakefulReceiver"></receiver>

第二步就是使用startWakefulService()方法来启动MyIntentService。这个方法除了在启动时WakefulBroadcastReceiver持有了一个WakeLock外,其它的都与startService()很相似。在startWakefulService()中所使用的Intent被隐式的携带了一个WakeLock。

public class MyWakefulReceiver extends WakefulBroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {// Start the service, keeping the device awake while the service is// launching. This is the Intent to deliver to the service.Intent service = new Intent(context, MyIntentService.class);startWakefulService(context, service);}
}

在服务结束时,要使用MyWakefulReceiver.completeWakefulIntent()将WakeLock释放。completeWakefulIntent()方法使用了被WakefulBroadcastReceiver传递过来的Intent对象:

public class MyIntentService extends IntentService {public static final int NOTIFICATION_ID = 1;private NotificationManager mNotificationManager;NotificationCompat.Builder builder;public MyIntentService() {super("MyIntentService");}@Overrideprotected void onHandleIntent(Intent intent) {Bundle extras = intent.getExtras();// Do the work that requires your app to keep the CPU running.// ...// Release the wake lock provided by the WakefulBroadcastReceiver.MyWakefulReceiver.completeWakefulIntent(intent);}
}

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

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

相关文章

解决pip安装报错:is not a supported wheel on this platform

解决pip安装报错&#xff1a;is not a supported wheel on this platform&#xff1a;https://blog.csdn.net/sty945/article/details/105200436/ 原因1 你下载安装的包不是当前平台所支持的 原因2 你下载的包&#xff0c;不符合你所在的平台的安装whl的名称规范&#xff0c;所…

MCI:移动持续集成在大众点评的实践

一、背景 美团是全球最大的互联网生活服务平台&#xff0c;为3.2亿活跃用户和500多万的优质商户提供一个连接线上与线下的电子商务服务。秉承“帮大家吃得更好&#xff0c;生活更好”的使命&#xff0c;我们的业务覆盖了超过200个品类和2800个城区县网络&#xff0c;在餐饮、外…

LeetCode 260. 只出现一次的数字 III(位运算)

1. 题目 给定一个整数数组 nums&#xff0c;其中恰好有两个元素只出现一次&#xff0c;其余所有元素均出现两次。 找出只出现一次的那两个元素。 示例 :输入: [1,2,1,3,2,5] 输出: [3,5]注意&#xff1a; 结果输出的顺序并不重要&#xff0c;对于上面的例子&#xff0c; [5,…

没有什么多模态任务是一层Transformer解决不了的!

文 | 子龙曾几何时&#xff0c;多模态预训练已经不是一个新的话题&#xff0c;各大顶会诸多论文仿佛搭上Visual和BERT&#xff0c;就能成功paper1&#xff0c;VisualBERT、ViLBERT层出不穷&#xff0c;傻傻分不清楚......这些年NLPer在跨界上忙活的不亦乐乎&#xff0c;提取视觉…

论文浅尝 - KDD2020 | 真实世界超图的结构模式和生成模型

论文笔记整理&#xff1a;毕祯&#xff0c;浙江大学硕士&#xff0c;研究方向&#xff1a;知识图谱、自然语言处理。链接&#xff1a;https://arxiv.org/abs/2006.07060动机图已被用作对人或物体之间的成对关系建模的强大工具。而超图是更广泛概念的一种特殊类型&#xff0c;其…

文档智能综述

1 万字综述&#xff1a;行业知识图谱构建最新进展 微信公众号链接&#xff1a;https://mp.weixin.qq.com/s/iVIoaZxhS1EyC2etRnBf4Q 2 高翔&#xff1a;智能文档处理与办公自动化 微信公众号链接&#xff1a;https://mp.weixin.qq.com/s/M6iv_NAnhibT36Y27BSSeQ 3 迪奥NLP丨企…

Android官方开发文档Training系列课程中文版:APP的内存管理

写在开头的话&#xff1a; 如果有同学对Android性能比较关注的&#xff0c;可以阅读这篇文章&#xff1a;Android性能优化建议 原文地址&#xff1a;http://android.xsoftlab.net/training/articles/memory.html 随机存储器(RAM)在任何运行环境中都是一块非常重要的区域&#…

LeetCode 1122. 数组的相对排序

1. 题目 给你两个数组&#xff0c;arr1 和 arr2&#xff0c; arr2 中的元素各不相同 arr2 中的每个元素都出现在 arr1 中 对 arr1 中的元素进行排序&#xff0c;使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。 示…

老板让我用少量样本 finetune 模型,我还有救吗?急急急,在线等!

文 | ????????????????编 | 王苏今天介绍的是一篇 NAACL21 新鲜出炉的工作&#xff01;NAACL 上周四出的结果&#xff0c;这篇工作本周一上传 arxiv&#xff0c;周二被王苏小哥哥发现&#xff0c;周三拜读了一下&#xff0c;今天就来和大家分享啦&#xff01;&…

如何基于深度学习实现图像的智能审核?

背景 美团每天有百万级的图片产生量&#xff0c;运营人员负责相关图片的内容审核&#xff0c;对涉及法律风险及不符合平台规定的图片进行删除操作。由于图片数量巨大&#xff0c;人工审核耗时耗力且审核能力有限。另外对于不同审核人员来讲&#xff0c;审核标准难以统一且实时变…

论文浅尝 - WSDM2020 | QAnswer KG: 基于RDF数据设计一个可移植问答系统

论文笔记整理&#xff1a;谭亦鸣&#xff0c;东南大学博士。来源&#xff1a;WSDM 2020链接&#xff1a;https://link.springer.com/chapter/10.1007/978-3-030-49461-2_251.介绍知识图谱问答(KGQA)系统的目标是&#xff1a;基于自然语言问题&#xff0c;从RDF数据集中抽取对应…

Android官方开发文档Training系列课程中文版:性能优化建议

原文地址&#xff1a;http://android.xsoftlab.net/training/articles/perf-tips.html 本篇文章主要介绍那些可以提升整体性能的微小优化点。它与那些能突然改观性能效果的优化手段并不属于同一类。选择正确的算法与数据结构必然是我们的第一总则&#xff0c;但是这不是我们这…

打破场景边界,PDFlux助你多领域表格提取

打破场景边界&#xff0c;PDFlux助你多领域表格提取&#xff1a;https://zhuanlan.zhihu.com/p/70092369

LeetCode 868. 二进制间距(位运算)

1. 解题 给定一个正整数 N&#xff0c;找到并返回 N 的二进制表示中两个连续的 1 之间的最长距离。 如果没有两个连续的 1&#xff0c;返回 0 。 输入&#xff1a;22 输出&#xff1a;2 解释&#xff1a; 22 的二进制是 0b10110 。 在 22 的二进制表示中&#xff0c;有三个 …

Kotlin代码检查在美团的探索与实践

背景 Kotlin有着诸多的特性&#xff0c;比如空指针安全、方法扩展、支持函数式编程、丰富的语法糖等。这些特性使得Kotlin的代码比Java简洁优雅许多&#xff0c;提高了代码的可读性和可维护性&#xff0c;节省了开发时间&#xff0c;提高了开发效率。这也是我们团队转向Kotlin的…

推荐几个出论文的好方向!

如果你准备发AI方向的论文&#xff0c;或准备从事科研工作或已在企业中担任AI算法岗的工作。那么我真诚的向大家推荐&#xff0c;贪心学院《机器学习高阶训练营》&#xff0c;目前全网上应该找不到类似体系化的课程。课程精选了四大主题进行深入的剖析讲解&#xff0c;四个模块…

开源开放 | 疾病科室、心血管系统疾病知识图谱发布,助力电子病历系统建设...

本文转载自公众号&#xff1a;OMAHA联盟。 资源发布OMAHA已建立“七巧板”医学术语集、“汇知”医学知识图谱、HiTA ICD编码服务、白皮书等资源&#xff0c;将于每月发布其中的一项或多项资源&#xff0c;敬请关注&#xff01;2009年&#xff0c;《中共中央国务院关于深化医药…

Android官方开发文档Training系列课程中文版:布局性能优化之布局层级优化

原文地址&#xff1a;http://android.xsoftlab.net/training/improving-layouts/index.html 引言 布局是直接影响用户体验的关键部分。如果实现的不好&#xff0c;那么布局很有可能会导致内存的紧张。Android的SDK包含的一些工具可以用来检查布局性能上的问题。结合本章的课程…

LeetCode 389. 找不同(位运算)

1. 题目 给定两个字符串 s 和 t&#xff0c;它们只包含小写字母。 字符串 t 由字符串 s 随机重排&#xff0c;然后在随机位置添加一个字母。 请找出在 t 中被添加的字母。 2. 解题 2.1 土办法&#xff0c;哈希map class Solution { public:char findTheDifference(string …

UAS-点评侧用户行为检索系统

背景 随着整个中国互联网下半场的到来&#xff0c;用户红利所剩无几&#xff0c;原来粗放式的发展模式已经行不通&#xff0c;企业的发展越来越趋向于精耕细作。美团的价值观提倡以客户为中心&#xff0c;面对海量的用户行为数据&#xff0c;如何利用好这些数据&#xff0c;并通…