我正在尝试构建一个应用程序,在该应用程序中我在应用程序上应用密码。当用户离开应用程序并再次打开时,我会要求输入密码。例如应用程序正在运行,用户单击主页按钮意味着离开应用程序然后他再次打开它,应用程序将要求输入密码。
我正在onResume()
活动方法中创建一个密码对话框。但问题是,如果用户进入下一个屏幕并返回该屏幕,那么onResume()
也会执行并要求输入密码。但我不想要这个。我希望只有当他离开应用程序并再次出现时才会出现密码警报。请告诉我应该在哪里编写该代码的任何解决方案。
我正在尝试构建一个应用程序,在该应用程序中我在应用程序上应用密码。当用户离开应用程序并再次打开时,我会要求输入密码。例如应用程序正在运行,用户单击主页按钮意味着离开应用程序然后他再次打开它,应用程序将要求输入密码。
我正在onResume()
活动方法中创建一个密码对话框。但问题是,如果用户进入下一个屏幕并返回该屏幕,那么onResume()
也会执行并要求输入密码。但我不想要这个。我希望只有当他离开应用程序并再次出现时才会出现密码警报。请告诉我应该在哪里编写该代码的任何解决方案。
试试看。
假设你有 A,B 活动,在 A 中创建一个静态变量,作为loggedIn=false;
现在假设你从 A 开始 B,在 B 上的 onbackpress 方法总是让 loggedIn=true;
在活动 A 的恢复方法检查中
if(!loggedIn){ showLogin dialog } 然后再次分配 true loggedIn=true;
现在,如果用户按下主页按钮,loggedIn 标志将为 false,并且当恢复应用程序时,将调用登录对话框。
假设您有两个活动 a(显示对话框)和 b。当您从一个活动 a 导航到另一个活动时 b。活动 a 进入后台。活动 b 处于前台。两者都被放入活动后台。后堆栈的工作方式类似于 LIFO(后进先出)。当您单击返回按钮时。活动 b 从回栈中被推入并显示活动 a。当活动暂停时,它必须恢复。当您的活动停止时,会调用 onStart() 并连续调用 onResume()。因此,如果您在 onResume() 中调用对话框,它将显示出来。
看看下面的链接。
http://developer.android.com/training/basics/activity-lifecycle/index.html。
http://developer.android.com/guide/components/tasks-and-back-stack.html。
注意从上面的链接引用:多个任务可以同时在后台举行。但是,如果用户同时运行多个后台任务,系统可能会开始销毁后台活动以恢复内存,从而导致活动状态丢失。请参阅以下有关活动状态的部分。
编辑
您必须实现 onCreate() 方法来执行基本的应用程序启动逻辑,该逻辑在活动的整个生命周期内只发生一次。所以在 onCreate() 中显示对话框而不是 onResume()。除非活动被破坏,否则它不会再次被创建。
您可以创建一个活动来处理身份验证过程并调用它 (A)。并让您当前的活动为(B)和(C)。所以,事情是这样的:
1- 活动 (A) 是启动器。
2-添加android:noHistory="true"
到<activity>
manifest.xml 中的活动 (A) 标记
3- 从 (A) 您可以导航到 (B) 然后到 (C)。
4- 从 (C) 您可以导航回 (B),但您将无法导航回 (A)。
您可以在按下主页键时设置变量
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_HOME)
{
fromHome = true;
}
return false;
};
并在您从此活动导航时设置变量 false
fromHome = false;
并检查标志OnResume()
在我看来,您实际上要跟踪的是应用程序中“已启动”活动的数量:#(Started activities) > 0 则意味着您的应用程序尚未被置于后台,因为如果用户按下 Home,您的所有应用程序的活动都必然会调用 onStop()。
为了跟踪“开始”活动的数量,您可以像这样引入一个单例:
public class LifecycleTracker {
private LifecycleTracker mInstance;
private int mNrOfStarted;
private LifecycleTracker() {
mNrOfStarted = 0;
}
public static LifecycleTracker getInstance() {
if (mInstance == null) {
mInstance = new LifecycleTracker();
}
return mInstance;
}
public void incrementStarted() {
mNrOfStarted++;
}
public void decrementStarted() {
mNrOfStarted--;
}
public boolean fromBackground() {
return mNrOfStarted == 0;
}
}
然后,在所有 Activity 的 onStart() 方法中,您应该首先检查您是否来自后台:
if (LifecycleTracker.getInstance().fromBackground()) {
//start authentication
//don't forget to increment after authentication as well!
} else {
LifecycleTracker.getInstance().incrementStarted();
}
在所有 Activity 的 onStop() 方法中,您应该减少:
LifecycleTracker.getInstance().decrementStarted();