计时器中,使用Timer,TimerTask和Handler实现计时器功能和刷新界面,但是在实际操作中有一个问题,就是锁屏状态下,线程进入到睡眠状态,那么handler也就无法进行时间和界面的修改,时间到了也无法点亮屏幕和播放声音。
如何在锁屏状态乃至系统进入休眠后,仍然保持系统的网络状态以及通过程序唤醒手机呢?答案就是Android中的WakeLock机制。
官方对于WakeLock的解释:
PowerManager:This class gives you control of the power state of the device.
PowerManager.WakeLock: lets you say that you need to have the device on.
PowerManager负责对Android设备电源相关进行管理,而系统通过各种锁对电源进行控制,WakeLock是一种锁机制,只要有人拿着这把锁,系统就无法进入休眠阶段。既然要保持应用程序一直在后台运行,那自然要获得这把锁才可以保证程序始终在后台运行。
WakeLock 使用代码:
WakeLock wakeLock = null;
//获取电源锁,保持该服务在屏幕熄灭时仍然获取CPU时,保持运行,当TimerTask开始运行时加入如下方法
private void acquireWakeLock()
{
if (null == wakeLock)
{
PowerManager pm = (PowerManager)this.getSystemService(Context.POWER_SERVICE);
wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK|PowerManager.ON_AFTER_RELEASE, "PostLocationService");
if (null != wakeLock)
{
wakeLock.acquire();
}
}
}
在时间到了释放死锁
//释放设备电源锁
private void releaseWakeLock()
{
if (null != wakeLock)
{
wakeLock.release();
wakeLock = null;
}
}
上面第一个方法是获取锁,第二个方法是释放锁,一旦获取锁后,及时屏幕在熄灭或锁屏长时间后,系统后台一直可以保持获取到锁的应用程序运行。获取到PowerManager的实例pm后,再通过newWakeLock方法获取wakelock的实例,其中第一个参数是指定要获取哪种类型的锁,不同的锁对系统CPU、屏幕和键盘有不同的影响,第二个参数是自定义名称。
各种锁的类型对CPU 、屏幕、键盘的影响:
PARTIAL_WAKE_LOCK:保持CPU 运转,屏幕和键盘灯有可能是关闭的。
SCREEN_DIM_WAKE_LOCK:保持CPU 运转,允许保持屏幕显示但有可能是灰的,允许关闭键盘灯
SCREEN_BRIGHT_WAKE_LOCK:保持CPU 运转,允许保持屏幕高亮显示,允许关闭键盘灯
FULL_WAKE_LOCK:保持CPU 运转,保持屏幕高亮显示,键盘灯也保持亮度
ACQUIRE_CAUSES_WAKEUP:强制使屏幕亮起,这种锁主要针对一些必须通知用户的操作.
ON_AFTER_RELEASE:当锁被释放时,保持屏幕亮起一段时间
最后声明权限:
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.DEVICE_POWER"/>
相关推荐
在AndroidManifest.xml文件中,我们需要添加相应的权限,如` android.permission.WAKE_LOCK`,以便在锁屏时保持设备唤醒状态,防止在执行锁屏操作时设备立即进入休眠。 2. **BroadcastReceiver**: 实现一键锁屏...
资源包括如何在一个activity A里激活另一个activity B。 然后在两个activity之间用handler传输数据。在activity A里定义全局变量handler,用sendMessage来发数据,在handler里数据以消息队列的方式发送。
在这个场景下,可能会创建一个Intent来触发锁屏操作,并设置相应的IntentFilter以便BroadcastReceiver能够捕获。 7. **异步操作**: 为了保证用户体验,锁屏操作应该在一个后台线程中执行,避免阻塞主线程。可以...
在这种情况下,Handler机制可以作为一个有效的工具来实现线程间的通信。本文将深入探讨如何在Fragment和Activity之间使用Handler进行交互。 首先,了解Handler的基本概念。Handler是Android中的一个消息处理类,它...
在Android开发中,Handler是一种非常重要的机制,它用于在主线程和子线程之间进行通信,处理异步消息。理解并熟练使用Handler是每个Android开发者必备的技能之一。本篇文章将详细讲解Handler的基本概念、工作原理...
在Android开发中,`Handler`是一个至关重要的组件,主要用于解决线程间的通信问题,尤其是在UI线程和其他工作线程之间。本篇文章将深入探讨`Handler`的使用方法,包括其基本概念、工作原理以及如何避免内存泄露和...
在Android开发中,Handler是一种非常重要的机制,它用于在主线程中处理来自其他线程的消息,从而实现线程间通信,尤其是对UI的更新。在这个“handler的简单示例”中,我们将深入探讨Handler的工作原理及其在异步更新...
在Android应用开发中,Handler是一种重要的线程通信机制,它与Looper、Message紧密配合,用于在不同的线程间传递消息,解决多线程同步问题。本篇将详细讲解Handler的使用,包括如何创建Handler对象、如何发送和处理...
在Android开发中,`Handler`是一个至关重要的组件,它用于在主线程中处理来自其他线程的消息,确保UI更新和事件处理的同步性。本文将详细介绍`Handler`的几种常见写法,以及如何使用`Handler.Callback`进行消息处理...
然后,我们可以在后台线程中创建一个无限循环,每次迭代时发送一个消息,让`Handler`更新动画的状态。例如,我们可以创建一个逐渐改变的图片位置来实现平移动画: ```java new Thread(new Runnable() { private ...
在Android开发中,`Handler`是一个非常重要的组件,它用于处理UI线程之外的异步消息,实现线程间通信。`Handler`、`Looper`和`Message`三者共同构成了Android的消息处理机制,帮助开发者在不同的线程之间传递数据和...
例如,在一个后台服务中,可以通过Handler将数据传递到UI线程,更新界面状态。 总之,Handler是Android中进行线程间通信和异步处理的重要工具,熟练掌握Handler的使用,有助于编写出高效、响应迅速的Android应用。...
本篇将深入探讨如何利用Handler在线程之间传递代码,以实现异步处理和保持UI线程的流畅。 首先,理解Handler的基本原理。Handler是Android中的一个消息处理类,它与Looper和Message紧密配合,形成了一个消息队列。...
在描述中提到的进度条自动滚动示例中,`Handler`被用来更新UI(进度条)的状态。 `Thread`是程序执行的实体,每个Android应用都拥有一个主线程,负责处理所有的UI事件,包括触摸事件、动画以及布局更新。然而,耗时...
在Android开发中,`Handler`是一个至关重要的组件,主要用于处理线程间的通信,尤其是主线程(UI线程)与工作线程之间的交互。本`Handler`推荐用法的示例,旨在帮助开发者理解和掌握如何有效地使用`Handler`来管理...
在这个系统中,JobHandler是核心组件,它负责执行具体的业务逻辑。下面我们将详细探讨JobHandler调度器的工作原理、功能特性以及如何进行实际操作。 1. **工作原理**: JobHandler调度器采用中心式调度模型,通过...
同时,Handler还能帮助开发者实现复杂的同步机制,例如在不同线程间传递状态更新或结果。 总结来说,Handler机制是Android中实现多线程通信的重要手段,通过理解其内部实现原理,开发者可以更好地利用这一工具,...
Session是Web开发中的一个关键概念,它允许服务器存储客户端(浏览器)的会话信息,以便在多个请求之间保持状态。通常,Session在ASP.NET、Java Servlets或PHP等Web框架中广泛使用。在HTTP Handler中实现Session共享...
Foxit PDF Preview Handler 是一款专为Outlook 2007设计的插件,它使得用户可以在不离开邮件客户端的情况下预览PDF附件。这款工具极大地提升了处理PDF文档的效率,尤其是在处理大量PDF邮件附件时,避免了频繁打开...