前面也说了。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来动态取消或加入屏幕超时任务的更多相关文章

  1. Vis.js – 基于浏览器的动态 JavaScript 可视化库

    Vis.js 是一个动态的,基于浏览器的可视化库.该库被设计为易于使用,能处理大量的动态数据.该库由以下几部分组成:一是数据集和数据视图,基于灵活的键/值数据集,可以添加,更新和删除项目,订阅数据集变 ...

  2. 开发Portlet第二步:如何将Crystal静态Portlet转变成基于测试数据的动态Portlet?

    当基于Crystal的静态Portlet开发完成后,在与后台服务联调前,还需要将Portlet转换成基于测试数据的动态Portlet.具体步骤如下: 分步指南 复制Portlet项目,并修改相关的po ...

  3. 基于 JDK 的动态代理机制

    『动态代理』其实源于设计模式中的代理模式,而代理模式就是使用代理对象完成用户请求,屏蔽用户对真实对象的访问. 举个最简单的例子,比如我们想要「FQ」访问国外网站,因为我们并没有墙掉所有国外的 IP,所 ...

  4. Upsync:微博开源基于Nginx容器动态流量管理方案

    Upsync:微博开源基于Nginx容器动态流量管理方案 https://mp.weixin.qq.com/s?__biz=MzAwMDU1MTE1OQ==&mid=404151075& ...

  5. 基于ngx_lua的动态服务路由方案

    基于ngx_lua的动态服务路由方案 http://geek.csdn.net/news/detail/131497

  6. 第二百六十四节,Tornado框架-基于正则的动态路由映射分页数据获取计算

    Tornado框架-基于正则的动态路由映射分页数据获取计算 分页基本显示数据 第一步.设置正则路由映射配置,(r"/index/(?P<page>\d*)", inde ...

  7. 第二百六十三节,Tornado框架-基于正则的动态路由映射

    Tornado框架-基于正则的动态路由映射 1.在路由映射条件里用正则匹配访问路径后缀2.给每一个正则匹配规则(?P<设置名称>)设置一个名称,3.在逻辑处理的get()方法或post() ...

  8. Freemaker基于word模板动态导出压缩文件汇总整理

    Freemaker基于word模板动态导出压缩文件汇总整理 Freemaker基于word模板动态导出单个文件思路和代码详情见连接: https://www.cnblogs.com/lsy-blogs ...

  9. Freemaker基于word模板动态导出汇总整理

    Freemaker基于word模板动态导出汇总整理 一.使用的jar包: 二.Word模板动态导出的基本思路: 1.首先通过自己在word中创建好需要导出的word文本+表格的模板,模板中需要填写内容 ...

随机推荐

  1. JAVA 获取访问者IP

    * 获取访问者IP * * 在一般情况下使用Request.getRemoteAddr()即可,但是经过nginx等反向代理软件后,这个方法会失效. * * 本方法先从Header中获取X-Real- ...

  2. ArcGIS 空间查询一例

    ISpatialFilter spatialFilter = new SpatialFilterClass(); spatialFilter.Geometry = Polygon ;//设置用于筛选几 ...

  3. Python学习笔记3:简单文件操作

    # -*- coding: cp936 -*- # 1 打开文件 # open(fileName, mode) # 參数:fileName文件名称 # mode打开方式 # w     以写方式打开. ...

  4. 一种基于RGB空间的对照度增强的filter

    今天看前辈博客的时候看到一种新的基于RGB颜色空间的image contrast enhance filter 流浪的鱼link: http://blog.csdn.net/jia20003/arti ...

  5. layer:web弹出层解决方案

    layer:web弹出层解决方案 一.总结 一句话总结:http://layer.layui.com/ 1.layer中弹出层tips的使用(代码)是怎样的? 使用还是比较简单方便的 //tips层- ...

  6. POJ 2141 模拟

    思路:字符串解密 啥都告诉你了 模拟就好 //By SiriusRen #include <cstdio> #include <cstring> using namespace ...

  7. javafx style and cssFile

    public class EffectTest extends Application { public static void main(String[] args) { launch(args); ...

  8. JeeSite信息化快速开发平台

     平台简介 JeeSite是基于多个优秀的开源项目,高度整合封装而成的高效,高性能,强安全性的开源Java EE快速开发平台. JeeSite是您快速完成项目的最佳基础平台解决方案,JeeSite是您 ...

  9. C_数组详解

    数组: 一 一维数组 1.1 一维数组的定义: 类型符 数组名[常量表达式]; int a[10]; 说明: 1.数组的命名规则遵循标识符命名规则. 2.定义时需要指定元素的个数.方括号里的常量表达式 ...

  10. IFC数据模式架构的四个概念层

    IFC模型体系结构由四个层次构成, 从下到上依次是 资源层(Resource Layer).核心层(Core Layer).交互层(Interoperability Layer).领域层(Domain ...