我的应用程序包含敏感的用户信息,我们需要实现一个密码屏幕,以便在用户打开应用程序时显示。 这是我在阅读 this post 后尝试的两种方法.
使用静态变量并在每个 Activity 的
onStop()
中重置它,并在每个 Activity 的onStart()
中再次检查它并显示密码如果时间超过最小阈值(例如 1-2 秒),则显示屏幕。这种方法的问题是我的应用程序还使用 Intent 调用相机和条形码扫描仪,用户可能会在这些外部应用程序中花费更长的时间。在这种情况下,我可以提高阈值,但这会使计算变得复杂,不是一个很好的解决方案。我使用这种方法尝试了另一种方法。
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/