1

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

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包含必要验证步骤的活动 () 并使其正常工作。

我最初将它放在ONCREATEMainActivity即在 AndroidManifest 中启动)中。这似乎工作正常。但随后开始重新锁定能力。所以试着把它移到ONSTARTor ONRESUME。但是当我的 APP 中的另一个 ACTIVITY 获得焦点或屏幕旋转时,PasswordActivity再次触发。那是行不通的。

在这里,我发现了一个线程,建议在 Manifest 中将其设置为 LAUNCHER 应用程序,然后当密码确定时,调用 MainActivity。这似乎效果更好......但随后遇到了一个问题,即只有当用户按下主屏幕上的后退按钮(我假设停止我的应用程序)并再次启动应用程序时,它才会“重新锁定”。虽然没有捕捉到另一个应用程序接管设备。

因此,基于此,在查看了所有关于生命周期的文档之后(尽管其中大多数是基于 ACTIVITY 的,而不是基于 APPLICATION 的),不知道如何捕捉应用程序本身失去焦点(另一个应用程序接管)以及如何处理自动或手动睡眠(上面的 C 和 D)以及时间延迟检查。我假设这将是几个调用或步骤的组合,但目前不确定是哪些调用或步骤。

有什么建议吗?

4

1 回答 1

2

我想我是通过一些建议和一些研究得出的。我在这里发布我的解决方案,以防它可以帮助其他人,有人看到我还没有看到或遇到的明确缺陷,或者有人有其他可能改进它的输入。

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

为了解决这个问题......我创建了一个名为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...,如果至少间隔2分钟,则要求输入密码。如果用户关机或关闭应用程序,那么重启也会触发密码。

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

到目前为止,一切都很好。希望这对其他人有帮助。

于 2016-05-27T01:25:32.413 回答