Android 后台简历上的密码

Android 后台简历上的密码,android,passwords,android-activity,android-lifecycle,Android,Passwords,Android Activity,Android Lifecycle,我有一个问题,如果有适当的方法来处理这种情况: 我希望我的应用程序在应用程序第一次启动时立即启动密码活动,或者用户从后台恢复密码活动(例如,用户单击“主页”按钮,将应用程序移动到后台,然后再次启动) 我知道我可以使用特殊权限并授予对系统任务的访问权限来完成这项工作,但我不想这样做。你们中的一些人还建议使用onPause、onResume和onStop生成一个布尔变量,并将其状态从true更改为false。但这只适用于只有一个活动的情况——一旦从一个活动移动到另一个活动,就必须添加Activity

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

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

我知道我可以使用特殊权限并授予对系统任务的访问权限来完成这项工作,但我不想这样做。你们中的一些人还建议使用onPause、onResume和onStop生成一个布尔变量,并将其状态从true更改为false。但这只适用于只有一个活动的情况——一旦从一个活动移动到另一个活动,就必须添加ActivityResult或其他处理布尔变量的内容

那么也许你可以提出更多的建议

更新:

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

@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);
    }
}
public boolean getLockStatus() {
    return getSharedPreferences("SOMETAG", 0).getBoolean("LOCK", true);
}

若pinStart为true,则表示锁已激活,用户必须在应用程序启动时输入密码。但若你们只需点击“主页”按钮并再次启动应用程序,就不会询问密码。如何处理?我想在用户进入应用程序后立即启动密码活动,但当他在应用程序内导航时,并没有密码。此外,我希望在每个活动中都有这种功能,而不仅仅是在main中。

通过实现自己的应用程序对象,您可以在各个活动中保持一些公共状态

创建一个扩展
应用程序的类,如下所示:

public class MyApplication extends Application {
    boolean userIsLoggedIn;

    public boolean isUserLoggedIn() {
        return userIsLoggedIn;
    }

    public void setUserIsLoggedIn(boolean loggedIn) {
        userIsLoggedIn = loggedIn;
    }
}
然后将其用作清单文件中的应用程序:

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

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

public void setLockStatus(boolean lock) {
   getSharedPreferences("SOMETAG", 0).edit().putBoolean("LOCK", lock)
        .commit();
}
稍后,当您想检查您的应用程序是否已锁定时(可能在下一个活动的启动中):

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

因此,当应用程序启动时,您的每个活动都会检查我们的标志是否已锁定

@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中启动新活动,我们可以执行以下操作:

    @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); 
    }
编辑:还需要设置AppStatus(false);如果您真的要离开应用程序。


希望这能给你一个解决方法的想法,你需要自己实现回压逻辑(何时锁定应用程序,何时不锁定)。

你是否正在尝试为你的应用程序而不是整个手机制作另一个屏幕锁?你可以将布尔值存储在preferencenope中,我正在尝试仅为我的应用程序设置屏幕锁。它是应用程序的一部分,只是为了一些数据保护。不清楚您试图保护这些信息的人是谁,因为专门为您的应用程序设置的另一个屏幕锁很可能只会激怒用户,不会提供额外的安全性。有人偷了手机,你想保护它不受什么影响?我想保护应用程序内部数据不受影响,例如,家庭成员不小心拿着手机浏览,想检查这个应用程序包含哪些数据。是财务经理,所以必须有密码。我也通过复选框做了这个,所以如果用户不想保护应用程序-轻松地取消选中一个密码。请描述一下如何检查用户是否来自应用程序内的其他活动,或者他正在从后台重新启动应用程序?这是我关心的问题,而不是如何重用另一个类来检查日志状态。我采纳了你的建议,但结合V M的:)Thanksok,然后如何处理这种情况:应用程序有一个锁,用户启动第一个显示密码活动的活动。用户输入密码并返回到第一个活动。但第一个活动位于顶部,因为密码活动位于顶部。这是一个循环:)然后您还需要一个标志,当您启动Tactivity()或按back(并留在应用程序中)时,该标志将被设置,以表示您从未离开过应用程序。例如,如果你的活动周期是A->B->C,当你在B时按back将设置一个标志,表明你仍然在应用程序中,并且你不需要锁定onStop()。这就是我要找的-如何设置这些标志以及在哪里:))完成。您还需要实现与按back相同的逻辑,例如,在第一个活动中,您需要锁定back press,而在其他活动中,您不需要锁定back press。谢谢,我将尝试在我的应用程序中采用此选项:)!
    @Override
    public void onStop() {
       super.onStop();
       if(getAppStatus() == false) setLockStatus(true); // locking the app
       else setLockStatus(false); 
    }