基于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);
        	}
    }

           通过这样已处理,就能达到动态控制这个任务的作用,还是非常简单实用的。源码里还是有很多精华代码及处理方法,关键是我们要去熟悉、了解、掌握、灵活运用!android之大,驾驭了就是美,驾驭不了就是魔!继续努力!

时间: 2024-08-02 14:56:01

基于ContentObserver来动态取消或添加屏幕超时任务的相关文章

基于AJAX的动态树型结构的设计与实现

ajax|动态|设计|树型结构 <B>摘 要</B>:简要介绍了一种通用的,动态树型结构的实现方案,该方案基于Asynchronous JavaScript and XML,结合Struts框架设计实现了结构清晰.扩展性良好的多层架构,数据存储于数据库,结合XML描述树的节点信息,使得任何按预定的XML文档描述的信息都可以通过动态树来展现.<br /><table border="0" cellspacing="0" cel

JAVA高级:基于JSP的动态网站开发技术

js|动态|高级 动态网站开发技术 早期的动态网站开发技术使用的是CGI-BIN接口.开发人员编写与接口相关的单独的程序和基于Web的应用程序,后者通过Web服务器来调用前者.这种开发技术存在着严重的扩展性问题--每一个新的CGI程序要求在服务器上新增一个进程.如果多个用户并发地访问该程序,这些进程将耗尽该Web服务器所有的可用资源,直至其崩溃. 为克服这一弊端,微软公司提出了Active  Server  Pages(ASP)技术,该技术利用"插件"和API简化了Web应用程序的开发

js动态给table添加/删除tr的方法

这篇文章介绍了js动态给table添加/删除tr的方法,有需要的朋友可以参考一下   复制代码 代码如下:  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <TITLE> New Document </TITLE> <META NAME="Generator" CONTENT="Edi

为 Linux Deepin 添加屏幕保护

在 Linux Deepin 下添加屏幕保护程序,可以按照下面步骤进行. 1.在软件中心搜索并安装下面 xscreensaver 相关软件包,或打开终端: sudo apt-get install xscreensaver xscreensaver-gl-extra xscreensaver-data-extra  2.点击"应用程序-系统工具-屏幕保护程序",打开屏幕保护程序的首选项: 在此,您可以设置屏幕保护程序的模式,并预览相关屏保方案. 3.设置"屏幕保护程序&quo

vc60-VC++6.0基于对话框给多个按钮添加位图

问题描述 VC++6.0基于对话框给多个按钮添加位图 VC++6.0基于对话框如何给多个按钮添加位图?菜鸟一个,不要笑话,敬请详解! 解决方案 VC中如何在对话框上显示位图 解决方案二: http://blog.csdn.net/yuzhongchun/article/details/8656773

《响应式Web设计:HTML5和CSS3实践指南》——2.10节基于before及after伪元素添加字符

2.10 基于before及after伪元素添加字符 就像在电视剧<迷离时空>(The Twilight Zone)中遗失的一集一样,CSS提供的新属性赋予了使用者在内容中添加伪标记的能力.可能听起来会有点奇怪,但这种方法却有着众多的应用场景.例如一个场景是,需要在显示的时候把文本内容放进引号之中,但是同时不想在内容或者主题文件中添加这些引号,显然这样是比较明智的做法.或者你也想通过标签和@标记尝试时下流行的Twitter,例如想要在内容之前添加#或是@符号.采用CSS标记方法即可完成功能,呈

动态库 添加函数-已编译好的动态库中添加一个函数

问题描述 已编译好的动态库中添加一个函数 RT,在Linux环境下,我有一个已经编译好的动态链接库,现在我想在没有源码的条件下,往这个库里面添加一个函数,有没有办法做到呢?请高手指教 解决方案 自己再生成一个库包装一下这个已有的库,并添加新的函数

基于JSP的动态网站开发技术_JSP编程

随着Web技术的发展和电子商务时代的到来,人们不再满足于建立各种静态地发布信息的网站,更多的时候需要能与用户进行交互,并能提供后台数据库的管理和控制等服务的动态网站. 动态网站开发技术 早期的动态网站开发技术使用的是CGI-BIN接口.开发人员编写与接口相关的单独的程序和基于Web的应用程序,后者通过Web服务器来调用前者.这种开发技术存在着严重的扩展性问题--每一个新的CGI程序要求在服务器上新增一个进程.如果多个用户并发地访问该程序,这些进程将耗尽该Web服务器所有的可用资源,直至其崩溃.

JS动态给对象添加属性和值的实现方法_javascript技巧

如下所示: var obj={}; for(var i=0;i<10;i++){ eval("obj.p"+i+"="+i); } 以上就是小编为大家带来的JS动态给对象添加属性和值的实现方法全部内容了,希望大家多多支持~ 以上是小编为您精心准备的的内容,在的博客.问答.公众号.人物.课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索js 北京赛车冠亚和值技巧.时时彩和值技巧.福彩3d和值计算技巧.快3和值技巧.重庆时时彩和值技巧,以便于您获取更多的