为Android应用程序实施密码锁

时间:2012-09-19 23:56:26

标签: android

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

  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;
    }
    
  3. 但是当我在每个活动的onStart方法中检查它时,这将始终返回true,因为该过程已经在onStart中开始了

    当用户打开应用程序时,是否还有其他方法可以显示密码?即使用户点击主屏幕退出应用程序,然后从最近的应用程序返回应用程序,也应该显示它。

1 个答案:

答案 0 :(得分:4)

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

我所做的是编写Activity的抽象子类,并覆盖onResume()。在那里,决定是否需要显示针锁屏幕。如果你这样做,请完成自己并开始锁销活动。让你的所有活动扩展这项活动。

要记住你所处的位置,你可以为用于启动锁定锁定活动的意图添加额外的“起始意图”。当应用程序解锁时,pin锁定活动可以使用该额外功能将用户放回原位。

如果您的应用是基于片段的,那么这很简单。无论何时恢复托管所有片段的活动,都会显示pin锁定片段。就这样。

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

任何利用检查前台进程的线程的解决方案都是一个糟糕的想法,因为电池的影响。

最后,您可能想要质疑每次将应用程序带到前台时锁定引脚的要求。如果我反弹阅读短信并在10秒后回来我被迫重新输入一个别针,这似乎太过分了。时间基础似乎更合适。

相关问题