阅读:8129回复:5

Android7.1监听用户一段时间无操作

楼主#
更多 发布于:2019-08-28 18:28
用户需求:1分钟没有任何操作,自动隐藏SystemUI
想问一下这个1分钟没有任何操作应该怎么判断?
我有2个思路:
1.参考系统的休眠流程,这个就是判断用户一段时间后没有操作就休眠或者启动屏保,看了一下这个流程感觉有点复杂,没有看明白
2.在系统Activity里面加定时器,在onCreate()启动定时器,在onStop()取消定时器,在dispathTouchEvent()里面监听用户ActionDown(按下动作)取消定时器,ActionUP(手抬起动作)启动定时器。这样任何一个Activity启动后就会启动定时器,在没有触摸屏幕操作后(暂时只考虑触屏操作),定时器就会计时,到1分钟后触发。
大家是否有更好的方法?
[url]http://190.lsal.cn/195/1329.gif?0728100424873[/url]
沙发#
发布于:2019-08-28 19:29
可以直接套用系统的休眠机制。

系统在达到规定时间,用户都没有操作,会触发进入休眠。
通过修改系统sleep_timeout的默认值来设置超时时间,以毫秒为单位,例如我要设置3分钟无操作即进入休眠,我可以在串口或者adb命令行下:
settings put secure sleep_timeout 180000
可以用一下命令来读取:
settings get secure sleep_timeout

 如果要预制,直接在SettingsProvider APP里面的xml修改默认值。
=========================================================================
这里不详细讲了,具体怎么个流程,逻辑,怎么计算时间,我先不讲。到时候我会完整的发一个帖子介绍。我现在只说下具体的位置。

当超时后,会通过handle来执行这个函数。
   private void handleUserActivityTimeout() { // runs on handler thread
        synchronized (mLock) {
            if (DEBUG_SPEW) {
                Slog.d(TAG, "handleUserActivityTimeout");
            }


            mDirty |= DIRTY_USER_ACTIVITY;
           updatePowerStateLocked();
        }
    }
你可以在直接在上述函数中做处理,也可以在updatePowerStateLocked()中去判断当前的mDirtyDIRTY_USER_ACTIVITY位置为1的情况做处理。
If you have nothing to lose, then you can do anything.
板凳#
发布于:2019-08-28 19:58
我这个需求是固定1分钟的超时时间,不能直接用sleep_timeout吧?应该设置一个固定的1分钟的值,仿照休眠的计时方法,做一个自己的超时流程,进行触发
[url]http://190.lsal.cn/195/1329.gif?0728100424873[/url]
地板#
发布于:2019-08-28 20:00
zhaoyf13:我这个需求是固定1分钟的超时时间,不能直接用sleep_timeout吧?应该设置一个固定的1分钟的值,仿照休眠的计时方法,做一个自己的超时流程,进行触发回到原帖
可以用系统的来sleep来改,你也可以用自己的流程来做。自己的流程来做的话,你就是系统计算是否到达超时时间那里要加上你自己的时间计算。



可能自己加还简单些。哈哈
If you have nothing to lose, then you can do anything.
4楼#
发布于:2019-08-30 11:49
感谢兄弟指点迷津,功能已经实现了。在PowerManagerService里面启动线程,计时,到了60秒就触发。userActivityNoUpdateLocked()方法里面计时重置。
[url]http://190.lsal.cn/195/1329.gif?0728100424873[/url]
5楼#
发布于:2019-08-30 17:23
优秀!!!
If you have nothing to lose, then you can do anything.
游客

返回顶部