android - 为 Android 应用程序实现密码锁

标签 android

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

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

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

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

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

最佳答案

我已经实现了这个确切的功能。我基本上完成了您的#1,但方式更简洁。

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

为了记住您所在的位置,您可以在用于启动 pin 锁定 Activity 的 Intent 中额外添加一个“开始 Intent ”。当应用程序解锁时,pin lock activity 可以使用这个额外的东西让用户回到原来的位置。

如果您的应用是基于 fragment 的,这将很简单。每当承载所有 fragment 的 Activity 恢复时,您都会显示 pin 锁 fragment 。就这样。

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

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

最后,您可能想质疑每次将应用程序带入前台时都需要 pin 锁的要求。如果我跳出阅读短信并在 10 秒后回来,我被迫重新输入 PIN 码,这似乎太过分了。基于时间似乎更合适。

关于android - 为 Android 应用程序实现密码锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12504462/

相关文章:

android - 如何在sqlite中删除数据库?

android - OnTouchEvent 不适用于 subview

安卓 GPS : how to check if a certain point has been reached?

android - 动画结束时如何删除 View ?

android - AppCompat 弹出菜单 RuntimeException

android - 如何使用自定义 ListView 适配器捕获多个选定的项目数据?

android - 在 android 和 ios 应用程序中显示图像的最可行方法

android - 同一行上的多个 RelativeSizeSpan

java - 使用 oncreateoptionsmenu 中的 Android youtube 播放器 Activity

android - 目前有安卓版的图片编辑SDK吗