Android保持设备唤醒状态_anroid partial_wake_lock-程序员宅基地

技术标签: Android开发  android  设备唤醒  

为了避免电池的消耗,当Android设备出于闲置状态的时候,就会处于睡眠状态。但是有的时候应用需要唤醒屏幕或者CPU并且保持唤醒状态来完成一些工作。

保持屏幕唤醒

如果你的应用需要保持屏幕唤醒,例如游戏或者电影。最好的方法就是在你的Activity中使用FLAG_KEEP_SCREEN_ON,这个标签只能用在Activity,不能用在Service或者其他组件。

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

这个方法不需要特别的权限,并且平台可以正确的进行管理,不需要担心释放不需要的资源。

另一种方法就是可以在应用的布局文件中添加android:keepScreenOn=”true”.

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

上面的两种方法相同,你可以使用任意一个,在程序中添加这个标签的好处就是你可以在需要的地方清除这个标签。

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON.

事实上,你不需要清除FLAG_KEEP_SCREEN_ON标签,除非你不想屏幕保持唤醒。因为窗口管理者可以帮你正确的管理在后台和前台。

保持CPU唤醒

如果你需要CPU在进入睡眠状态之前保持运行状态,你可以使用PowerManager的服务特性你调用wake locks,wake locks允许你的应用去控制你的设备电池的状态。

但是我们需要注意的就是创建并且维持wake locks对设备电池寿命有影响,因此只有在确实需要的时候才去使用,并且在尽可能短的时间去维持它。像我们在Activity中就不需要使用这个,因为按照上面的直接使用上面的那个标签就行。

一种需要使用wake locks的情况就是当屏幕属于睡眠状态的时候,后台的服务需要获取一个wake lock去让CPU运行去做一些工作。

使用wake locks需要加入下面的这个WAKE_LOCK权限在应用的Manifest文件中。

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

另外,如果你的应用包含了一个广播接收者,在这个广播接收者中启动了一个服务去做一些工作,那么你可以管理wake lock通过一个WakefulBroadcastReceiver,但是如果你应用不使用这种方式,你可以按照下面这个直接来设置:

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

释放wake lock可以调用wakelock.release(),需要注意的是释放是必须的,不然电池会持续消耗。

使用WakefulBroadcastReceiver

使用广播接收者,然后结合一个服务就可以管理一个后台任务的生命周期。
WakefulBroadcastReceiver是一个特殊类型的广播接收者,它只关心为你的应用创建或者管理一个 PARTIAL_WAKE_LOCK。WakefulBroadcastReceiver可以传递工作给Service或者IntentService,另外当任务完成,就可以释放wake lock。

第一步,在manifest文件中声明一个receiver:

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

下面就是使用startWakefulService()启动MyIntentService:

public class MyWakefulReceiver extends WakefulBroadcastReceiver {
    

    @Override
    public 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()释放wake lock。

public class MyIntentService extends IntentService {
    
    public static final int NOTIFICATION_ID = 1;
    private NotificationManager mNotificationManager;
    NotificationCompat.Builder builder;
    public MyIntentService() {
        super("MyIntentService");
    }
    @Override
    protected 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);
    }

WakeLock的使用:
1、获取WakeLock:
void acquire():获得WakeLock
void acquire(long timeOut):获得WakeLock timeOut时长,当超过timeOut之后系统自动释放WakeLock。
2、释放WakeLock:release()
3、判断是否已经获取WakeLock:boolean isHeld()
4、void setReferenceCounted(boolean value):是否使用引用计数。类似于垃圾回收策略,只是把垃圾回收改成了WakeLock回收。如果value是true的话将启用该特性,如果一个WakeLock acquire了多次也必须release多次才能释放掉。但是如果释放次数比acquire多则会抛出RuntimeException(“WakeLock under-locked ” + mTag)异常。默认是开启了引用计数的!

PowerManager的几个实用方法
1、boolean PowerManager::isScreenOn ()判断屏幕是否亮着(不管是暗的dimed还是正常亮度),在API20被弃用,推荐boolean PowerManager::isInteractive ()

2、void PowerManager::goToSleep(long time)time是时间戳,一般是System.currentTimeMillis()+timeDelay。强制系统立刻休眠,需要Manifest中添加权限”android.permission.DEVICE_POWER”。按下电源键锁屏时调用的就是这个方法。

3、void PowerManager::wakeUp(long time)与上面对应。参数含义,所需权限与上同。按下电源键解锁屏幕时调用的就是这个方法。

4、void PowerManager::reboot(String reason)重启手机,reason是要传给linux内核的参数,比如“recovery”重启进recovery模式,“fastboot”重启进fastboot模式。需要权限”android.permission.REBOOT”。

原文链接:
Keeping the Device Awake

参考文章:
Android中的WakeLock使用

可参考文章:
唤醒锁: 检测 Android* 应用中的 No-Sleep(无法进入睡眠)问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/hp910315/article/details/48713187

智能推荐

从ES5到ESNext-这是自2015年以来添加到JavaScript的所有功能-程序员宅基地

文章浏览阅读2.6k次,点赞3次,收藏2次。I wrote this article to help you move from pre-ES6 knowledge of JavaScript and get you quickly up to speed with the most recent advancements of the language. 我写这篇文章是为了帮助您摆脱ES6之前JavaScript知识,并Swift掌握该语..._es5 next() 和next

基于BP神经网络手写数字和字母识别-程序员宅基地

文章浏览阅读582次,点赞7次,收藏19次。这个程序是在MATLAB中编写,基于BP神经网络的文字符号识别系统的具体实现,该系统既可以实现单一手写字符,也可以实现一连串的字符,而且具有较高的准确率。用来测试结果的图片我选择的是在纸上写的字符和在电脑上的软件画板上写的字符,我将根据不同的书写方式来进行测试。我的字符共有2类,一共有36个字符,所以需要设计出可以识别36个字符的神经网络,实现把输入的字符能够在输出准确的识别出来。我选择用一个层隐含层的三层神经网络来实现函数的映射关系,如果隐含层的层数太多的话,训练的时间会增加太多, 太过于复杂。

太难了!2021计算机考研这么多大学专业课变化!-程序员宅基地

文章浏览阅读9.1k次,点赞4次,收藏16次。小编每年都在整理专业课变化的大学名单:【19考研】复习大半年,这些学校考试科目却变了【计算机/软件专业】【20考研】48所大学!计算机/软件专业课变化的大学名单!下面是小编发现的今年考试..._408和853

smartconfig一键配置udp原理_为什么smart config使用udp-程序员宅基地

文章浏览阅读4.6k次。1、一种基于WIFI通信的电子设备接入网方法,其特征在于,所述方法包括: 步骤S1:发送端将需传输的原始数据信息加密为十六进制形式的待发送数据; 步骤S2:发送端将待发送数据以及数据索引加入多播IP地址; 步骤S3:发送端将该多播IP地址映射为对应的多播MAC地址; 步骤S4:发送端重复发出包含该多播MAC地址的多播数据包; 步骤S5:接收端根_为什么smart config使用udp

btslab全攻略——搭建安装和sql注入-程序员宅基地

文章浏览阅读1.1k次。一、介绍直接引用官方说明BTS PenTesting Lab is an open source vulnerable web application, created by Cyber Security & Privacy Foundation (www.cysecurity.org). It can be used to learn about many different types of web application vulnerabilities.Currently, th_btslab

python可以这样学怎么样_笨办法学python怎么样-程序员宅基地

文章浏览阅读52次。python小白在开始学习之前,都会纠结到底选择一本什么样的书籍来作为入门的教材。今天我们讲一讲《笨办法学python》这本书。在这本书的帮助下,你将通过非常简单的练习学会一门编程语言。做练习 是每个程序员的必经之路:1.从头到尾完成每一个习题。2.一字不差地录入每一段程序。3.让程序运行起来。就是这样,刚开始可能会非常难,但你要坚持下去。如果你通读了这本书,并且每晚花一两个小时做习题,你可以为自..._python可以这样学 怎么样

随便推点

h3csnmp管理命令_如何配置H3C SNMP配置实例-程序员宅基地

文章浏览阅读530次。配置Agent# 配置Agent的IP地址为1.1.1.1/24,并确保Agent与NMS之间路由可达。(配置步骤略)# 设置SNMP基本信息,包括版本、团体名。 system-view[Sysname] snmp-agent sys-info version v1 v2c[Sysname] snmp-agent community read public[Sysname] snmp-agent ...

docker-compose使用多个docker-compose.yaml配置文件创建容器_容器中多个yaml-程序员宅基地

文章浏览阅读4.6k次。docker-compose.yaml文件创建容器是十分方便的,只用运行docker-compose up -d就可创建好配置文件里所有的容器了,但是如果有多个容器,又不想都放在一个docker-compose.yaml文件里怎么办呢?没关系,docker-compose命令的-f参数支持使用多个配置文件,1)一次使用多个文件docker-compose -f ./docker-compose.a.yaml -f ./docker-compse.b.yaml up -d如果是多个文件就使用多_容器中多个yaml

系统架构设计师-第12章-信息系绍酣忽如何里论与实践-软考-学习笔记(1)-程序员宅基地

文章浏览阅读600次,点赞9次,收藏5次。定义1 : 软件或计算机系统的信息系统架构是该系统的一个(或多个)结构,而结构由软件元素、元素的外部可见属性及它们之间的关系组成。定义2: 信息系统架构为软件系统提供了一个结构、行为和属性的高级抽象, 由构成系统元素的描述、这些元素的相互作用、指导元素集成的模式及这些模式的约束组成。定义3: 信息系统架构是指一个系统的基础组织,它具体体现在:系统的构件,构件之间、构件与环境之间的关系,以及指导其设计和演化的原则上。

全景图拼接和视频行人检测(Python + opencv)-程序员宅基地

文章浏览阅读326次,点赞5次,收藏6次。3. 根据关键点特征和描述符, 对两张图像进行匹配, 得到若干匹配点对, 并移除错误匹配4. 使用Ransac算法和匹配的特征来估计单应矩阵(homography matrix)5. 通过单应矩阵来对图像进行仿射变换6. 两图像拼接,重叠部分融合7. 裁剪以获得美观的最终图像本次实验通过拍摄多组不同的图片来实现图像的拼接.这里拼接的结果如下图这里获得的图像为拼接后的公共部分,拼接效果并不明显。以下实验用例来自。

Android开发者跳槽面试,含BATJM大厂,Android开发全套学习-程序员宅基地

文章浏览阅读647次,点赞14次,收藏10次。本文的特点在于将繁琐的知识化为系列专题的形式展现给读者,当你能跟随博主构建的体系化学习知识点时,恭喜你,你已经干掉了BAT、字节、网易等大厂的几乎80%以上的Android开发人员。一共十个专题,包括了Android进阶所有学习资料,Android进阶视频,Flutter,java基础,kotlin,NDK模块,计算机网络,数据结构与算法,微信小程序,面试题解析,framework源码!接下来给大家介绍一份体系化的学习资料,是由我和我的伙伴们历经4个多月,整理编写而成的,他考的是策略模式+工厂模式。

JNI原理学习,2024年最新面试总结报告范文-程序员宅基地

文章浏览阅读684次,点赞14次,收藏22次。*要想成为高级安卓工程师,必须掌握许多基础的知识。**在工作中,这些原理可以极大的帮助我们理解技术,在面试中,更是可以帮助我们应对大厂面试官的刁难。网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)一个人可以走的很快,但一群人才能走的更远!