将PASSWORD屏幕添加到应用程序在设备休眠时重新锁定的应用程序?

时间:2016-05-18 02:43:58

标签: android password-protection sleep-mode

我有一个自动锁定的应用程序(需要密码输入屏幕)......

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的{​​{1}}中(已在AndroidManifest中发布)。这似乎工作正常。但随后开始重新锁定功能。所以尝试将其移至MainActivityONSTART。但是当我的APP中的另一个ACTIVITY聚焦,或者屏幕旋转时,ONRESUME再次发射。那不行。

在这里,我发现一个帖子建议将它作为Manifest中的LAUNCHER应用程序,然后当密码正常时,调用MainActivity。这似乎工作得更好......但后来遇到一个问题,只有当用户按下主屏幕上的后退按钮(我假设停止我的应用程序)并再次启动应用程序时它才会“重新锁定”。虽然没有抓住另一个APP接管设备。

基于此,在查看了我可以在生命周期中找到的所有文档(尽管其中大多数是基于ACTIVITY,而不是基于应用程序)不确定如何捕获APP本身失去焦点(另一个应用程序接管)和如何处理自动或手动睡眠(上面的C& D)以及延时检查。我假设它将是几个调用或步骤的组合,但目前还不确定究竟是哪些。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

我认为我使用了一些建议以及一些研究来解决这个问题。我在这里发布我的解决方案,以防它可以帮助别人,有人看到我没有看到或遇到的明确缺陷,或者某人有其他一些可能改善它的输入。

如上所述,我能说的最大问题是没有任何内置函数调用可以确定“你的应用程序”何时不在前台。 onPauseonResume是基于活动的,而不是基于应用的...因此,从应用中的活动更改为活动,甚至是屏幕旋转,都会触发它们。

为了解决这个问题......我创建了一个名为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);
    }
}

在每项活动中,我都会创建(或修改)onPauseonResume,因为......

@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,然后再次返回我的APP ...如果至少2分钟失效,则要求输入密码。如果用户关闭或关闭应用程序,则重新启动也将触发密码。

我选择了2分钟,因为在我们的应用中,这似乎是一个不错的“时间流逝”。当然,这也可以改变。

到目前为止,这么好。希望这有助于其他任何人。