在Android应用程序中启动密码保护

9
我正在寻找一种在启动时为我的安卓应用程序提供密码保护的方法,即当启动/恢复属于我的apk包的活动时,将显示一个密码对话框。
我已经尝试了一些方法(例如扩展应用程序类等),但似乎没有一种方法能够正常工作。 要么它们不在UI线程上运行,要么在每次启动/恢复时都不显示对话框。

Application类是正确的选择,请发布您尝试过的内容/方式,包括代码。因为可能存在某些问题。 - Pentium10
2个回答

14
所以这是我坚持使用的解决方案。在我的Application类中,我存储了一个长整型变量,记录了上一个Activity最后一次被暂停的系统时间。
import android.app.Application;
public class MyApplication extends Application {
    public long mLastPause;

    @Override
    public void onCreate() {
        super.onCreate();
        mLastPause = 0;
        Log.w("Application","Launch");
    }
}

在每个 onPause 方法中,我将该值更新为当前时间。

@Override
public void onPause() {
    super.onPause();
    ((MyApplication)this.getApplication()).mLastPause = System.currentTimeMillis();
}

在每个 onResume 中,我都将其与当前时间进行比较。如果已经过了一定的时间(目前为5秒),则会显示我的密码提示。

@Override
public void onResume() {
    super.onResume();
    MyApplication app = ((MyApplication)act.getApplication());
    if (System.currentTimeMillis() - app.mLastPause > 5000) {
        // If more than 5 seconds since last pause, prompt for password
    }
}

感谢您提供的解决方案,我认为还有一点需要注意:在onResume函数中的代码也应该在onStart函数中执行。我不得不添加这部分内容以避免一个烦人的情况:在干净退出后重新打开应用程序时,锁屏没有显示。 - Yoann Hercouet
1
@YoannHercouet 我不太确定是否需要这样做。据我所了解,在冷启动后,onResume方法将在onStart方法之后被调用。请参阅Android文档中的示意图:https://developer.android.com/images/activity_lifecycle.png - m__
1
此外,您可以创建一个LockActivity类,并将所有活动扩展到该类中,而不是修改所有活动的onResume和onPause方法。这样做可以使您的代码更加模块化和易于维护。 - Khaled Zarrad
@KhaledZarrad,您能否举个创建锁定活动并覆盖方法的例子? - dmSherazi

3

继承 Application 类,在其中设置一个变量,以确定下一次应用程序发生某事时,是否应该提示对话框。

在 Activity、Service 等中,使用接收到的 Context 获取您的 Application,如果该变量设为显示对话框,则从您的 Activity 代码(即 UI 线程)中显示对话框。您可能会将此代码放在 onResume 中。

在 onPause 中,将变量设置为下一次要显示它。在 onResume 中,将其设为 false。


谢谢你的回答。不过有一件事...似乎没有应用程序范围内的onPause和onResume,这意味着我必须在每个活动中设置变量。这将导致密码对话框在每次启动/恢复新活动时显示。只在Application类的onCreate中设置变量仅在应用程序冷启动时起作用,这可能不会经常发生。如果我错了,请纠正我 :-) - m__
你需要让它变得更加智能。使用计数器代替布尔值。每次发生 onResume 事件时增加计数器,每次发生 onPause 事件时减少计数器。如果在活动开始时计数器为0,则显示密码。 - Moncader
好的,现在我已经实现了你的解决方案,但它仍然无法正常工作,因为在每次启动/恢复活动时(即使是从另一个活动调用),都会显示密码提示。这是因为调用活动的onPause在启动onResume之前执行,这意味着变量始终为0。onPause: ((MyApplication)this.getApplication()).mActivityCounter--;onResume: MyApplication app = ((MyApplication)act.getApplication()); if (app.mActivityCounter == 0) { // 进行密码检查 } app.mActivityCounter++;有什么想法吗? - m__
你可以在你的应用程序中保留一个布尔值,在初始化时将其设置为false,在输入密码时将其设置为true。当所有服务、提供者和活动被杀死后,应用程序也会死亡,这样下一次启动任何东西时,布尔值将被重置。 - Moncader
是的,那可能是一个解决方案,但当应用程序在后台长时间暂停而用户不知道时,我仍然会遇到问题(据我所了解,这种情况很常见)。无论如何,Application类似乎仍然是正确的选择,所以我将继续尝试。感谢迄今为止所有的帮助(当然,更多的想法是受欢迎的;-))。 - m__

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接