【问题标题】:Passcode on resume from background后台简历密码
【发布时间】:2014-01-25 00:43:53
【问题描述】:

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

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

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

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

更新:

这是来自我的应用程序主要活动的示例代码:

@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 为真 - 表示锁定已激活,用户必须在应用启动时输入密码。但是,如果您只是单击主页按钮并再次启动应用程序,则不会询问密码。如何处理?我想在用户进入应用程序后立即启动密码活动,但是当他在应用程序内部导航时 - 没有密码。我也想在每一个活动中都有这个,不仅仅是在主要的。

【问题讨论】:

  • 您是否要为您的应用而不是整个手机制作另一个屏幕锁?
  • 你可以优先存储布尔值
  • 不,我正在尝试仅为我的应用程序设置屏幕锁定。它是应用程序的一部分,只是为了保护数据。
  • 目前还不清楚您试图保护这些信息的人是谁,因为专门为您的应用设置的另一个屏幕锁很可能只会惹恼用户并且不会提供额外的安全性。你想保护它免受什么,有人偷了手机?
  • 我正在尝试保护应用程序内部数据,例如不小心拿手机浏览并想检查此应用程序包含哪些数据的家庭成员。它是财务经理,所以它必须有一个密码。我也通过复选框做到了这一点,所以如果用户不想保护应用程序 - 轻松取消选中密码。

标签: android passwords android-activity android-lifecycle


【解决方案1】:

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

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

稍后当您想检查您的应用是否被锁定时(可能在下一个活动的 onStart 中):

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

所以现在每次我们在启动之前启动一个新活动时,我们都必须设置一个我们仍在应用程序中的标志,以便 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);如果你真的要离开应用程序。

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

【讨论】:

  • 好的,那么如何处理这种情况:应用程序有锁,用户启动第一个显示密码活动的活动。用户输入密码并返回到第一个活动。但第一个活动是 onStop 因为密码活动在顶部。这是一个循环:)
  • 那么你还需要一个标志,当你 startActivity() 或按回(并留在应用程序中)时设置一个标志,表明你从未离开过应用程序。所以举个例子,如果你的活动周期是 A -> B -> C,当你在 B 的时候按下返回会设置一个标志,表明你还在 App 中,你不需要锁定 onStop()。
  • 这就是我正在寻找的 - 如何设置这些标志以及在哪里:)))
  • 完成。您还需要实现与按回相同的逻辑,例如在第一个活动中您需要锁定回按,而在其他活动中则不需要。
  • 谢谢,我会尝试将它应用到我的应用中 :)!
【解决方案2】:

您可以通过实现自己的应用程序对象来跨活动维护一些公共状态。

创建一个扩展 Application 的类,如下所示:

public class MyApplication extends Application {
    boolean userIsLoggedIn;

    public boolean isUserLoggedIn() {
        return userIsLoggedIn;
    }

    public void setUserIsLoggedIn(boolean loggedIn) {
        userIsLoggedIn = loggedIn;
    }
}

然后将其用作清单文件中的应用程序:

<application ... ... android:name="MyApplication">

然后在您的活动中,您会得到这样的应用程序对象:

@Override
public void onStart() {
    MyApplication myApp = (MyApplication)getApplication();
    boolean isLoggedIn = myApp.isUserLoggedIn();
    if (!isLoggedIn) {
        // .. open login activity
    }
}

【讨论】:

  • 请多描述一下如何检查用户是否来自应用程序内的另一个活动,或者他是否正在从后台重新启动应用程序?这对我来说是一个问题,而不是如何重用另一个类来检查记录状态..
  • 我采纳了你的建议,但结合了 V M 的:) 谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多