基于ContentObserver来动态取消或加入屏幕超时任务
前面也说了。ContentObserver能够来监控数据库里某一项数据的变化,当然也能够同一时候监控多个数据项的变化。
笔者在项目中须要改动到屏幕超时的需求,比方在车载业务中,倒车事件发生的时候,是不须要屏幕超时变黑的,相当于这个计时timer要Reset一下,相同在蓝牙电话也要Reset一下,最好就是在这样的特殊任务的时候。这个屏幕超时计时任务就不要跑起来,这样是最好的。那怎么实现呢?
笔者通过研究phonewindowsmanger.cpp中发现,终于都是驱动一个mScreenLockTimeout。它怎么来的呢?见例如以下代码:
ScreenLockTimeout mScreenLockTimeout = new ScreenLockTimeout();
class ScreenLockTimeout implements Runnable {
Bundle options; @Override
public void run() {
synchronized (this) {
if (localLOGV) Log.v(TAG, "mScreenLockTimeout activating keyguard");
if (mKeyguardDelegate != null) {
mKeyguardDelegate.doKeyguardTimeout(options);
}
mLockScreenTimerActive = false;
options = null;
}
} public void setLockOptions(Bundle options) {
this.options = options;
}
}
Runnable 是重点啊。
归根结底还是驱动一个runnable。那怎么控制呢?看到里面的源代码。也有大量操作这个mScreenLockTimeout,能够动态的remove,再动态的启动起来。笔者就想起了用contentobserver来做进程间通讯了。比方写一个值代表取消这个任务,写另外一个值就加入这个任务。笔者大概代码例如以下:
private final class CalcScnTimeoutObserver extends ContentObserver {
public CalcScnTimeoutObserver(Handler handler) {
super(handler);
}
@Override
public void onChange(boolean selfChange) {
ContentResolver resolver = mContext.getContentResolver();
mCalcScnTimeoutValue = Settings.System.getIntForUser(resolver,
Settings.System.SCREEN_TIMEOUT_CALC_INFO, 0,
UserHandle.USER_CURRENT);
Slog.d(TAG,"##CalcScnTimeoutObserver: " + mCalcScnTimeoutValue);
if(1 == mCalcScnTimeoutValue){
synchronized (mScreenLockTimeout) {
if (mLockScreenTimerActive) {
// reset the timer
mHandler.removeCallbacks(mScreenLockTimeout);
//mHandler.postDelayed(mScreenLockTimeout, mLockScreenTimeout);
mLockScreenTimerActive = false;
}
}
} else if(2 == mCalcScnTimeoutValue){
synchronized (mScreenLockTimeout) {
if (mLockScreenTimerActive) {
// reset the timer
mHandler.removeCallbacks(mScreenLockTimeout);
mHandler.postDelayed(mScreenLockTimeout, mLockScreenTimeout);
} else {
mHandler.postDelayed(mScreenLockTimeout, mLockScreenTimeout);
mLockScreenTimerActive = true;
}
}
}else {
Slog.e(TAG,"default novalid value ");
}
}
void observe() {
// Observe all users' changes
ContentResolver resolver = mContext.getContentResolver();
resolver.registerContentObserver(Settings.System.getUriFor(
Settings.System.SCREEN_TIMEOUT_CALC_INFO), false, this,
UserHandle.USER_ALL);
}
}
通过这样已处理,就能达到动态控制这个任务的作用,还是非常easy有用的。源代码里还是有非常多精华代码及处理方法。关键是我们要去熟悉、了解、掌握、灵活运用!android之大,驾驭了就是美。驾驭不了就是魔!继续努力!
基于ContentObserver来动态取消或加入屏幕超时任务的更多相关文章
- Vis.js – 基于浏览器的动态 JavaScript 可视化库
Vis.js 是一个动态的,基于浏览器的可视化库.该库被设计为易于使用,能处理大量的动态数据.该库由以下几部分组成:一是数据集和数据视图,基于灵活的键/值数据集,可以添加,更新和删除项目,订阅数据集变 ...
- 开发Portlet第二步:如何将Crystal静态Portlet转变成基于测试数据的动态Portlet?
当基于Crystal的静态Portlet开发完成后,在与后台服务联调前,还需要将Portlet转换成基于测试数据的动态Portlet.具体步骤如下: 分步指南 复制Portlet项目,并修改相关的po ...
- 基于 JDK 的动态代理机制
『动态代理』其实源于设计模式中的代理模式,而代理模式就是使用代理对象完成用户请求,屏蔽用户对真实对象的访问. 举个最简单的例子,比如我们想要「FQ」访问国外网站,因为我们并没有墙掉所有国外的 IP,所 ...
- Upsync:微博开源基于Nginx容器动态流量管理方案
Upsync:微博开源基于Nginx容器动态流量管理方案 https://mp.weixin.qq.com/s?__biz=MzAwMDU1MTE1OQ==&mid=404151075& ...
- 基于ngx_lua的动态服务路由方案
基于ngx_lua的动态服务路由方案 http://geek.csdn.net/news/detail/131497
- 第二百六十四节,Tornado框架-基于正则的动态路由映射分页数据获取计算
Tornado框架-基于正则的动态路由映射分页数据获取计算 分页基本显示数据 第一步.设置正则路由映射配置,(r"/index/(?P<page>\d*)", inde ...
- 第二百六十三节,Tornado框架-基于正则的动态路由映射
Tornado框架-基于正则的动态路由映射 1.在路由映射条件里用正则匹配访问路径后缀2.给每一个正则匹配规则(?P<设置名称>)设置一个名称,3.在逻辑处理的get()方法或post() ...
- Freemaker基于word模板动态导出压缩文件汇总整理
Freemaker基于word模板动态导出压缩文件汇总整理 Freemaker基于word模板动态导出单个文件思路和代码详情见连接: https://www.cnblogs.com/lsy-blogs ...
- Freemaker基于word模板动态导出汇总整理
Freemaker基于word模板动态导出汇总整理 一.使用的jar包: 二.Word模板动态导出的基本思路: 1.首先通过自己在word中创建好需要导出的word文本+表格的模板,模板中需要填写内容 ...
随机推荐
- 对比《动手学深度学习》 PDF代码+《神经网络与深度学习 》PDF
随着AlphaGo与李世石大战的落幕,人工智能成为话题焦点.AlphaGo背后的工作原理"深度学习"也跳入大众的视野.什么是深度学习,什么是神经网络,为何一段程序在精密的围棋大赛中 ...
- [Python] Manage Dependencies with Python Virtual Environments
Virtual Environments ensure that dependencies from one Python application don’t overwrite the depend ...
- JAVA学习第五十四课 — IO流(八)打印流 & 序列流
一.综合练习-文件清单列表 获取指定文件夹下,指定扩展名的文件(含子文件夹),并将这些文件的绝对路径写到一个文本文件里.也就是建立一个指定扩展名的文件列表 1.深度遍历 2.过滤器->容器 3. ...
- AVEVA PDMS 三维文字工具
AVEVA PDMS 三维文字工具 eryar@163.com 网上有个文字工具插件,可以在PDMS中创建三维的字母和数字,且字体样式只有一种,其下载地址为:http://www.plantcon.d ...
- StdTranslator - Translate PDMS to STD for STAAD.Pro
StdTranslator - Translate PDMS to STD for STAAD.Pro eryar@163.com STAAD.Pro是由美国世界著名的工程咨询和CAD软件开发公司—R ...
- Yahoo!团队:网站性能优化的35条黄金守则(转)
Excetional Performance 团队总结出了一系列可以提高网站速度的方法.可以分为 7大类 35条.包括内容 .服务器 . CSS . JavaScript .Cookie .图片 .移 ...
- 游标 scroll
scroll表示可随意移动游标指针(否则只能向前)
- 2017国家集训队作业[agc006e]Rotate 3x3
2017国家集训队作业[agc006e]Rotate 3x3 题意: 给你一个\(3*N\)的网格,每次操作选择一个\(3*3\)的网格,旋转\(180^\circ\).问可不可以使每个位置\(( ...
- 查看JSP和Servlet版本+
如何查看JSP和Servlet版本 找到jsp-api.jar和servlet-api.jar ,分别打开META-INF下的MAINMEFT.MF文件,查看对应的版本. 例: JSP版本: Mani ...
- rpm---rpm包管理
rpm命令是RPM软件包的管理工具.rpm原本是Red Hat Linux发行版专门用来管理Linux各项套件的程序,由于它遵循GPL规则且功能强大方便,因而广受欢迎.逐渐受到其他发行版的采用.RPM ...