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

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

目录

概述

使用唤醒锁的用法

保持屏幕在亮着

电视的环境模式

保持CPU处于运行状态


概述

为了避免多消耗电池电量,安卓设备会很快进入休眠状态.然而,也是需要保持它一直

处于唤醒的状态,来完成某些工作.

你使用的方法依赖于你的APP的需要.然而,通用的规则是你应该使用最轻量级的方法,

最小化你的APP对系统的影响.如下的部分描述了如何处理这样的用例,即设备的默认的

休眠行为与你的APP的需求是不一致的情况.

使用唤醒锁的用法

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

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

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

如果你的APP依赖于后台的服务,考虑使用作业调度器或者是Firebase的云消息

来触发这些有特定的间隔的服务.

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

陪伴设备管理器.

保持屏幕在亮着

特定的APP需要保持屏幕是一直开着的,例如游戏或者是电影APP.

为了做到这一点,最好的方式是在你的活动中使用FLAG_KEEP_SCREEN_ON.

(仅在活动中,而不是在一个服务或者是其它的APP组件中)

例如

Kotlin

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文件中实现这一点,使用的方法是

安卓的保持屏幕开的属性:

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

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完成了任务,

释放这个唤醒锁是很重要的,使用这个释放是为了避免浪费电池。

相关推荐
ZHANG13HAO2 小时前
Android 13 AOSP 内置 NekoTTS 中文免费商用 TTS 完整流程
android
许杰小刀6 小时前
ctfshow-web文件包含(web78-web86)
android·前端·android studio
Flamingˢ10 小时前
ZYNQ + OV5640 视频系统开发(四):HDMI 显示链路
嵌入式硬件·fpga开发·硬件架构·音视频
潜创微科技--高清音视频芯片方案开发10 小时前
2026年HUB方案商选型指南:主流厂商核心优势与不同应用场景适配方案深度分析
音视频·硬件工程
月诸清酒10 小时前
26-260410 AI 科技日报 (阿里开源视频模型HappyHorse登顶,马斯克疑似泄露Claude参数)
人工智能·开源·音视频
恋猫de小郭11 小时前
Android 上为什么主题字体对 Flutter 不生效,对 Compose 生效?Flutter 中文字体问题修复
android·前端·flutter
三少爷的鞋11 小时前
不要让调用方承担你本该承担的复杂度 —— Android Data 层设计原则
android
李李李勃谦12 小时前
Flutter 框架跨平台鸿蒙开发 - 创意灵感收集
android·flutter·harmonyos
ai产品老杨12 小时前
异构计算时代的视频底座:基于 ZLMediaKit 与 Spring Boot 的 X86/ARM 跨平台架构解析
arm开发·spring boot·音视频