android - 背景简历上的密码

标签 android passwords android-activity android-lifecycle

我有一个问题,是否有合适的方法来处理这种情况:

我希望我的应用程序在应用程序首次启动时立即启动密码 Activity ,或者用户从后台恢复它(例如,用户单击主页按钮并将应用程序移至后台,然后再次启动它)。

我知道我可以使用特殊权限并授予对系统任务的访问权限来执行此操作,但我不想这样做。还有一些人会建议使用 onPause、onResume 和 onStop - 创建一个 bool 变量并将其状态从 true 更改为 false。但这仅在您有一个 Activity 时才有效——一旦您从一个 Activity 移动到另一个 Activity ,您就必须添加 onActivityResult 或其他东西来处理 bool 变量。

所以也许您可以提出更多建议?

更新:

这是来 self 的应用主要 Activity 的示例代码:

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    if (getIntent().getAction() != null && getIntent().getAction().equals(Intent.ACTION_MAIN) && savedInstanceState == null) {
        requestPinCode();
        }
/* .. */
}

private void requestPinCode() {
    boolean pinStart = false;
    SharedPreferences appPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
    pinStart = appPrefs.getBoolean("switch_pincode", false);
    if (pinStart) {
        Intent intent = new Intent(this, PinCodeActivity.class);
        startActivity(intent);
    }
}

如果 pinStart 为真 - 这意味着锁定已激活并且用户必须在应用程序启动时输入密码。但是,如果您只是单击主页按钮并再次启动应用程序,则不会询问密码。如何处理?我想在用户进入应用程序后立即启动密码 Activity ,但当他在应用程序内导航时 - 没有密码。我也想在每个 Activity 中都有这个,而不仅仅是在主要 Activity 中。

最佳答案

您可以将 bool 值存储在 shared preferences 中,即使您切换 Activity ,它也会在内存中保持持久性。 例如:当您想解锁您的应用程序时(例如在 onStop() 中),您可以使用此方法将其设置为 false:

public void setLockStatus(boolean lock) {
   getSharedPreferences("SOMETAG", 0).edit().putBoolean("LOCK", lock)
        .commit();
}

稍后当你想检查你的应用程序是否被锁定时(可能在下一个 Activity 的开始时):

public boolean getLockStatus() {
    return getSharedPreferences("SOMETAG", 0).getBoolean("LOCK", true);
}

另请注意,如果未设置“LOCK”值(如 getBoolean 的第二个参数所示),此方法将返回 true。

因此,如果应用程序已锁定,您在启动时拥有的每个 Activity 都会检查我们的标志。

@Override
public void onStart() {
    super.onStart();
    if (getLockStatus() == true) {
        // show lockscreen
    } else {
       // we are not locked.
    }
}

现在我们还需要一个标志来检查我们是否仍在应用程序中并且从未离开过:

public void setAppStatus(boolean status) {
   getSharedPreferences("SOMETAG", 0).edit().putBoolean("IN_APP", status)
        .commit();
}
public boolean getAppStatus() {
    return getSharedPreferences("SOMETAG", 0).getBoolean("IN_APP", false);
}

所以现在每次我们启动一个新的 Activity 之前,我们都必须设置一个标志,表明我们仍在应用程序中,这样 onStop 就会知道我们不应该锁定应用程序。 例如,如果您的按钮 onClick 在 onClick 中启动一个新的 Activity,我们可以这样做:

    @Override
    public void onClick(View v) {
         setAppStatus(true); // we are not leaving the app.
         // startActivity(blabla);    
    }

现在 onStop 检查我们是否需要锁定:

    @Override
    public void onStop() {
       super.onStop();
       if(getAppStatus() == false) setLockStatus(true); // locking the app
       else setLockStatus(false); 
    }

编辑:您还需要 setAppStatus(false);如果您真的要离开应用程序。

希望这能让您了解如何解决它,您需要自己实现后退逻辑(何时锁定应用程序,何时不锁定)。

关于android - 背景简历上的密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20969848/

相关文章:

docker - 如何使用 docker-credential-pass 登录私有(private)注册表?

android-activity - Android 'kill' 一个Activity 可以不杀掉应用吗?

java - 如何在类里面启动 View ,然后在另一个 Activity 中调用它?

android - Firebase 条件列表数据检索 android

java - 安卓 + java.lang.NullPointerException : Attempt to invoke interface method

android - ListView 行内的 ViewPager 阻止触发 onItemClick

c# - ProtectedData 使用哪种加密算法?

Android 刷新 fragment 内的 ViewPager

python - Django:make_password 输出的密码与 django.auth 不同

android - ScrollView 滚动时圆角消失