一、Android 监听页面无操作,定时返回
已有项目新增需求,需监听页面是否有操作,如果在一定时间内没有操作则返回到指定页面。像一些定制化系统如果长时间停留在工程调试页面是不安全的,所以需要返回到主页,同样像电视盒子在感知无操作可以跳转到广告/屏保。
因为是已有项目,所以希望以尽可能小的代码入侵完成我们的功能。
二、功能分析
-
首先需要一个计时的功能。 一般想法是设置定时器,如果有操作就取消上一个,再新建新的计时器,这里我们用更简单一点的方法,用一个计时器即可,当感知到操作则更新时间,在计时器中如果当前时间与操作时间差值达到一定时间则触发我们的返回业务。
-
通知方式 如何通知,用广播、EventBus/RxBus 或者自定义回调都可以,能把事件回传就行
-
如何获取触摸事件更新 我们的应用基础是 Activity,所以只需要监听 Activity 中的 ACTION_UP 即可,重写 dispatchTouchEvent,插入我们的时间更新代码
三、实现
下面我们来写一段简单的代码:
通知用广播来实现
//ActivityMonitor
class ActivityMonitor {
private var recordTime = System.currentTimeMillis()//记录操作时间
private var disposable: Disposable? = null//计时器
private var context: Context? = null
companion object {
@JvmStatic
fun get(): ActivityMonitor {
return Holder.holder
}
}
object Holder {
@SuppressLint("StaticFieldLeak")
val holder = ActivityMonitor()
}
fun attach(context: Context) {
Log.d("zhou", "attach $context")
this@ActivityMonitor.context = context
Log.d("zhou", "ActivityMonitor >> $context")
}
//创建计时器
private fun createDisposable(): Disposable {
Log.d("zhou", "createDisposable")
return Observable.interval(2, TimeUnit.SECONDS)
.subscribe {
Log.d("zhou", "time === didi......")
val time = (System.currentTimeMillis() - recordTime) / 1000
if (time > 5) {
Log.d("zhou", "timeout...")
this@ActivityMonitor.context!!.sendBroadca