安卓手机APP开发_媒体开发部分__保持设备处于唤醒状态

embedded/2024/9/23 14:36:04/

安卓手机APP开发_媒体开发部分__保持设备处于唤醒状态

目录

概述

使用唤醒锁的用法

保持屏幕在亮着

电视的环境模式

保持CPU处于运行状态


概述

为了避免多消耗电池电量,安卓设备会很快进入休眠状态.然而,也是需要保持它一直
处于唤醒的状态,来完成某些工作.

你使用的方法依赖于你的APP的需要.然而,通用的规则是你应该使用最轻量级的方法,
最小化你的APP对系统的影响.如下的部分描述了如何处理这样的用例,即设备的默认的
休眠行为与你的APP的需求是不一致的情况.

使用唤醒锁的用法

在对你的APP加唤醒锁的支持之前,考虑你的APP的用例是否支持如下的备选解决方案:

如果你的APP正在执行长时间的HTTP下载,考虑使用下载管理器.

如果你的APP正在从一个外部的服务器同步数据,考虑创建一个同步的适配器.

如果你的APP依赖于后台的服务,考虑使用作业调度器或者是Firebase的云消息
来触发这些有特定的间隔的服务.

如果你需要无论何时,只要一个陪伴设备在用,你的陪伴的APP就在运行中,请使用
陪伴设备管理器.

保持屏幕在亮着

特定的APP需要保持屏幕是一直开着的,例如游戏或者是电影APP.
为了做到这一点,最好的方式是在你的活动中使用FLAG_KEEP_SCREEN_ON.
(仅在活动中,而不是在一个服务或者是其它的APP组件中)
例如

Kotlin


class MainActivity : Activity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)}
}

这个方法的优势是它不同于唤醒锁,它不需要有特定的权限,平台正确的管理着
用户在各个应用之间的切换,你的APP不需要担心关于没有的资源的回收问题.

另一个方法是在你的应用的XML文件中实现这一点,使用的方法是
安卓的保持屏幕开的属性:

<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。对于你的APP来说,
你能使用的哪一个方法都是好的。在你活动中,程序化地设置标识的优势是它给你程序化地
取消这个标识的灵活性,即它允许屏幕再关闭。


电视的环境模式

在电视上,FLAG_KEEP_SCREEN_ON应该被使用来阻止设备进入环境模式。
当FLAG_KEEP_SCREEN_ON没有被前台的活动设置时,在一段时间的非活动状态之后,
设备将自动地进入到环境模式。

保持CPU处于运行状态

如果你需要保持你的CPU处于运行状态,目的是为了在设备进入休眠之前完成一些工作,
你能使用一个电源管理器的系统设备特性,这个特性叫做唤醒锁。唤醒锁允许你的应用
控制主机设备的电源状态。

创建和保持唤醒锁,对于主机设备的电池寿命有戏剧性的重大的影响。因此,只有当你迫切地
需要使用它时,才应该使用唤醒锁,并且保持使用它的时间尽可能地短。例如,你应该根本不需要
在一个活动中使用它。如上的描述,如果你需要在你的活动中保持屏幕是亮的,使用
FLAG_KEEP_SCREEN_ON。

使用一个唤醒锁的一个合情合理的用例可能是一个后台的服务,它需要抓取一个唤醒锁,
来保持CPU处于运行状态,来实现屏幕不亮时的工作。再强调一下,这个做法应该是最小化的,
因为它对电池的寿命有影响。

为了使用一个唤醒锁,第一步是在你的配置文件中加上它的权限:

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

如果你的APP包含了一个广播接收器,使用了一个服务来做一些工作。这里是如何直接
地设置一个唤醒锁的方法:

Kotlin

val wakeLock: PowerManager.WakeLock =(getSystemService(Context.POWER_SERVICE) as PowerManager).run {newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyApp::MyWakelockTag").apply {acquire()}}


为了释放唤醒锁,调用wakelock.release()。这个释放是需要CPU的。只要你的APP完成了任务,
释放这个唤醒锁是很重要的,使用这个释放是为了避免浪费电池。


http://www.ppmy.cn/embedded/25384.html

相关文章

Python数组类+AI插件

目录 规划实现初始化插入删除查找 AI插件单测注释调优建议 小结 规划 先想清楚都写哪些&#xff0c;然后再动手操作 用Python写了一个简单数组类&#xff0c;首先思考下都写哪些功能&#xff1a; 插入删除查找用插件做单元测试和写注释 目的只是实现一个简单的数组类&#x…

【C/C++】动态内存管理(C:malloc,realloc,calloc,free || C++:new,delete)

&#x1f525;个人主页&#xff1a; Forcible Bug Maker &#x1f525;专栏&#xff1a; C | | C语言 目录 前言C/C内存分布C语言中的动态内存管理&#xff1a;malloc/realloc/realloc/freemallocrealloccallocfree C中的动态内存管理&#xff1a;new/deletenew和delete操作内…

C#中正则表达式(Regular Expression)

在C#中&#xff0c;正则表达式&#xff08;Regular Expression&#xff09;是一种强大的模式匹配工具&#xff0c;用于在文本中搜索、匹配和操作符合特定模式的字符串。它基于一种特定的语法&#xff0c;用于描述字符串的规则和模式。 正则表达式由各种字符和元字符组成&#…

【Python数据库】MongoDB

文章目录 [toc]数据插入数据查询数据更新数据删除 个人主页&#xff1a;丷从心 系列专栏&#xff1a;Python数据库 学习指南&#xff1a;Python学习指南 数据插入 from pymongo import MongoClientdef insert_data():mongo_client MongoClient(hostlocalhost, port27017)co…

2024年深圳杯东三省数学建模联赛A题论文首发+问题一代码分享

深圳杯A题论文代码分享资料链接&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1L2NVgoefSW-yuqZjEB3wcw 提取码&#xff1a;sxjm 基于优化模型的多个火箭残骸的准确定位 摘要 在现代航天技术中&#xff0c;火箭是实现空间探索的关键工具。由于火箭发射过程中的高成…

国标(GB)安全帽、安全救援头盔标准分享

前面讲到智能安全帽&#xff0c;虽然没有专属智能安全帽的标准&#xff0c;但其安全帽部分还是遵循各类国标&#xff0c;这里把我收集到和安全帽相关的标准进行总结分享 所有信息来自于《国家标准全文公开系统》&#xff0c;博客信息存在时效性&#xff0c;如信息有变化请以官…

力扣HOT100 - 207. 课程表

解题思路&#xff1a; class Solution {public boolean canFinish(int numCourses, int[][] prerequisites) {int[] inDegree new int[numCourses];//存每个结点的入度List<List<Integer>> res new ArrayList<>();//存结点之间依赖关系Queue<Integer>…

【对比学习】【论文翻译】Contrastive Multiview Coding

Contrastive Multiview Coding ECCV 2020 0.论文摘要和作者信息 摘要 人类通过许多感官通道观察世界&#xff0c;例如&#xff0c;由左眼观察的长波长光通道&#xff0c;或由右耳听到的高频振动通道。每个视图都是嘈杂和不完整的&#xff0c;但重要的因素&#xff0c;如物理…