我的android应用程序需要在第一个活动中输入密码.我希望能够在应用程序空闲一段固定时间后自动将应用程序发送回密码输入屏幕.
该应用程序有多个活动,但我希望超时对所有活动都是全局的.因此,在一个onPause()
方法中创建一个计时器线程是不够的Activity
.
我不确定应用程序空闲的最佳定义是什么,但没有活动的活动就足够了.
我知道已经接受了另一个答案,但我遇到了类似问题的工作,我想我会尝试另一种更简单的方法,我想我也可以记录是否有其他人想要尝试同样的问题path.enter代码在这里
一般的想法只是在任何Activity暂停时跟踪SharedPreference中的系统时钟时间 - 听起来很简单,但是,如果你使用的话,那就有一个安全漏洞,因为那个时钟会在重启时重置.解决这个问题:
拥有一个Application
子类或共享静态单例类,具有全局解锁启动状态(最初为false).只要您的应用程序进程,该值应该存在.
保存系统时间(实时在各相关开机以来)Activity
的onPause
进入SharedPreference
,如果当前的应用程序状态被解锁.
如果appwide unlocked-since-boot状态为false(干净的应用程序启动 - 应用程序或手机重新启动),请显示锁定屏幕.否则,检查SharedPreference
可锁定活动的onResume的值; 如果它不存在或大于SharedPreference
值+超时间隔,也会显示锁定屏幕.
解锁应用程序时,将appwide unlocked-since-boot状态设置为true.
除了超时,这种方法还会自动锁定您的应用程序,如果您的应用程序被杀死并重新启动或手机重新启动,但我不认为这对大多数应用程序来说是一个特别糟糕的问题.它有点过于安全,可能会对任务切换很多的用户造成不必要的锁定,但我认为通过彻底清除任何后台进程/唤醒锁问题(无需服务,警报或接收器)来减少代码和复杂性是值得的权衡).
要无论何时何时解决锁定应用程序的进程,都可以使用SharedPreference并为系统引导广播意图注册侦听器,以将Preference设置为false,而不是共享appwidewide单例以进行解锁.这再次增加了初始解决方案的一些复杂性,其好处是在应用程序的进程在超时间隔内落后的情况下更加方便,尽管对于大多数应用程序来说它可能有点过分.