我有一个可以自动锁定的应用程序(需要输入密码)...
a) when the app starts for the first time
b) when another app is started and takes over the device
c) when the device "sleeps" automatically
d) when the user "sleeps" the device manually
(note: with c & d, if the user "awakens" the app within 5 seconds, it does NOT ask for the password)
我也想为正在编写的应用程序执行此操作,因此我创建了PasswordActivity
带有必要的验证步骤的活动(),并使其正常运行。
我最初把它放在了ONCREATE
的MainActivity
(那是在AndroidManifest推出)。这似乎很好。但是随后就开始了重新锁定功能。因此,尝试将其移至ONSTART
或ONRESUME
。但是当我的APP中的另一个ACTIVITY聚焦或屏幕旋转时,PasswordActivity
再次触发。那行不通。
在这里,我发现了一个线程,建议在清单中将其设置为LAUNCHER应用程序,然后在密码确定时调用MainActivity。这似乎工作得更好...但是随后遇到一个问题,即只有当用户按下主屏幕上的“后退”按钮(我假设正在停止我的应用程序)并再次启动该应用程序时,它才会“重新锁定”。虽然不会捕获其他APP接管该设备。
因此,基于此,在查看了所有文档之后,我可以找到生命周期(尽管大多数生命周期是基于活动的,而不是基于应用程序的),因此不确定当APP本身失去焦点(另一个应用程序接管)时如何捕捉自动或手动睡眠(上面的C&D)以及延时检查。我假设它将是多个调用或步骤的组合,但是目前还不确定到底是哪个。
有什么建议吗?
我想我是通过一些建议以及一些研究得出的。我在这里发布我的解决方案,以防它可以帮助其他人,有人看到我还没有看到或遇到的明显缺陷,或者有人提供了其他可以改善它的输入。
如前所述,我可以说的最大问题是,没有任何内置函数调用可以确定“您的应用”何时不在前台。在onPause
和onResume
基于活动,而不是基于App ......从这样的活动,以改变在您的应用程序的活动,甚至屏幕旋转,火灾它们。
为了解决这个问题,我创建了一个名为的全局变量gv.appPauseTime
。我创建了两个单独的通用实用程序函数,可以从应用程序中的任何位置调用该函数。
public static void lockAppStoreTime() {
gv.appPauseTime=new Date();
}
public static void lockAppCheck(Activity act) {
boolean bLock=false;
// Check to see if this is the first time through app
if (gv.appPauseTime==null) {
bLock = true;
} else {
Date currTime = new Date();
long diffMillis = currTime.getTime() - gv.appPauseTime.getTime();
long diffInSec = TimeUnit.MILLISECONDS.toSeconds(diffMillis);
// Lock app if 120 seconds (2 minutes) has lapsed
if (diffInSec > 120) {
bLock=true;
}
}
gv.appLastPause = new Date();
if (bLock) {
Intent j = new Intent(act, PasswordActivity.class);
act.startActivity(j);
}
}
在每一次活动,我创建(或修改)的onPause
和onResume
是这样的...
@Override
public void onPause(){
super.onPause();
Util.lockAppStoreTime();
}
@Override
public void onResume(){
super.onResume();
Util.lockAppCheck(this);
}
当onPause
火灾,它存储了当前日期(时间)。当onResume
任何功能触发时,它会将当前日期(时间)与存储的日期(时间)进行比较。如果经过了120秒(2分钟),它将显示PasswordActivity以验证密码。它会在调用PasswordActivity之前“存储”当前日期(时间),以便它不会一直重复。
基本上,如果活动暂停与任何活动之间有2分钟的间隔(在“我的应用”中,恢复(或开始)),则会提示您输入密码。如果用户打开另一个APP,然后再次返回到我的APP ...,如果至少2分钟,则要求输入密码。如果用户关闭电源或关闭应用程序,则重新启动也会触发密码。
我选择了2分钟,因为在我们的应用程序中,这似乎是一个不错的“时间流逝”。当然,这也可以更改。
到现在为止还挺好。希望这对其他人有帮助。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句