我有一个问题,如果有适当的方法来处理这种情况:
我想我的应用程序在第一次启动应用程序时立即启动密码活动,或者然后用户从后台恢复它(例如用户单击主页按钮并将应用程序移动到后台然后再次启动它)。
我知道我可以使用特殊权限并授予对系统任务的访问权限,但我不想这样做。还有一些人会建议使用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为true - 表示锁已激活,用户必须在app start上输入密码。但是,如果您只是单击主页按钮并再次启动应用程序,则不会询问密码。怎么办呢?我想在用户输入应用程序后立即启动密码活动,但是当他在应用程序内导航时 - 没有密码。此外,我想在每个活动中都有这个,不仅仅是在主要活动中。
答案 0 :(得分:2)
您可以将布尔值存储在shared preferences中,即使您切换活动,它也会在内存中保持持久性。 例如:当您想要解锁应用程序时(例如在onStop()中),您可以使用此方法将其设置为false:
public void setLockStatus(boolean lock) {
getSharedPreferences("SOMETAG", 0).edit().putBoolean("LOCK", lock)
.commit();
}
稍后当您想检查您的应用是否已锁定时(可能在下一个活动的开始时):
public boolean getLockStatus() {
return getSharedPreferences("SOMETAG", 0).getBoolean("LOCK", true);
}
另请注意,如果未设置“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);
}
所以现在每次我们在启动它之前启动一个新活动时,我们必须设置一个我们仍然在App中的标志,以便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);如果您实际离开了申请表。
希望这能让您了解如何解决它,您需要自己实施背压逻辑(何时锁定应用程序以及何时不执行)。
答案 1 :(得分:1)
您可以通过实现自己的应用程序对象来维护活动中的一些常见状态。
创建一个扩展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
}
}