9

我的应用程序包含敏感的用户信息,我们需要实现一个密码屏幕,以便在用户打开应用程序时显示。这是我在阅读这篇文章后尝试的两种方法。

  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;
    }
    

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

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

4

1 回答 1

5

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

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

要记住您所在的位置,您可以在用于启动 pin 锁定活动的意图中添加额外的“起始意图”。当应用程序被解锁时,pin lock Activity 可以使用这个额外的东西来让用户回到他们原来的位置。

如果您的应用程序是基于片段的,这将很简单。每当托管所有片段的活动恢复时,您都会显示 pin 锁定片段。就这样。

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

any solution that utilizes a thread that checks foreground processes is a terrible idea because of the battery impact.

finally, you might want to question the requirement of having a pin lock every time the app is brought into the foreground. it seems excessive if i bounce out to read a text message and come back 10s later i'm forced to re-enter a pin. time based seems more appropriate.

于 2012-09-20T00:22:05.807 回答