为Android应用程序实施密码锁

ach*_*hie 9 android

我的应用程序具有敏感的用户信息,我们需要实现一个密码屏幕,以便在用户打开应用程序时显示.以下是我在阅读本文后尝试的两种方法.

  1. 使用静态变量并将其重置onStop()为每个活动,并在每个活动中再次检查它,onStart()如果时间超过最小门限,则显示密码屏幕,例如1-2秒.这种方法的问题在于我的应用程序还使用意图调用相机和条形码扫描仪,用户可能会在这些外部应用程序中花费更长的时间.在这种情况下我可以增加阈值,但它使计算变得复杂并且不是一个非常好的解决方案.

  2. 我使用这种方法尝试了另一种方法.

    protected boolean isAppOnForeground(final Context context) {
    List<RunningAppProcessInfo> appProcesses = ((ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE)).getRunningAppProcesses();
    
        if (appProcesses == null) {
            return false;
        }
    
        final String packageName = context.getPackageName();
    
        for (RunningAppProcessInfo appProcess : appProcesses) {
            if ((appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) && 
                 appProcess.processName.equals(packageName)) {
                return true;
            }
        }
        return false;
    }
    
    Run Code Online (Sandbox Code Playgroud)

但是当我在每个活动的onStart方法中检查它时,这将始终返回true,因为该进程已经在onStart中启动

当用户打开应用程序时,我可以使用任何其他方法来显示密码吗?即使用户点击主屏幕退出应用程序然后从最近的应用程序返回应用程序,也应该显示它.

Jef*_*man 5

我已经实现了这一确切功能。我基本上是做你的#1,但是用一种更干净的方式。

我所做的是编写的抽象子类Activity,然后重写onResume()。在此确定是否需要显示密码锁屏幕。如果您这样做了,请完成自己的工作,然后开始密码锁活动。让您的所有活动扩展此活动。

为了记住您当时的位置,您可以在用于启动图钉锁定活动的意图上额外添加一个“开始意图”。当应用程序解锁时,密码锁活动可以使用额外的费用将用户放回原处。

如果您的应用程序是基于片段的,这将很简单。只要恢复了托管所有片段的活动,您就会显示出密码锁片段。就这样。

由一系列活动组成的应用程序的问题在于,没有明确的“启动”应用程序的时机。这个概念不存在。这本质上是您在#1解决方案中发现的问题。onResume()似乎是一个不错的选择,但是可以出于很多原因调用它。例如,用户启动活动A,该活动开始了活动B。现在,他们按下了。显示密码锁,还是不?

由于电池的影响,任何利用线程检查前台进程的解决方案都是一个糟糕的主意。

最后,您可能想质疑每次将应用程序置于前台时都需要使用密码锁的要求。如果我跳出来阅读短信并在10秒钟后回来,这似乎是多余的,我被迫重新输入图钉。基于时间似乎更合适。

  • @pjco onStart / onStop是不正确的选择,因为如果从第一个活动开始第二个活动,则在第二个活动的onStart之后调用第一个活动的onStop。onResume / onPause是正确的选择 (4认同)