2

我正在尝试构建一个应用程序,在该应用程序中我在应用程序上应用密码。当用户离开应用程序并再次打开时,我会要求输入密码。例如应用程序正在运行,用户单击主页按钮意味着离开应用程序然后他再次打开它,应用程序将要求输入密码。

我正在onResume()活动方法中创建一个密码对话框。但问题是,如果用户进入下一个屏幕并返回该屏幕,那么onResume()也会执行并要求输入密码。但我不想要这个。我希望只有当他离开应用程序并再次出现时才会出现密码警报。请告诉我应该在哪里编写该代码的任何解决方案。

4

5 回答 5

1

试试看。

假设你有 A,B 活动,在 A 中创建一个静态变量,作为loggedIn=false;

现在假设你从 A 开始 B,在 B 上的 onbackpress 方法总是让 loggedIn=true;

在活动 A 的恢复方法检查中

if(!loggedIn){ showLogin dialog } 然后再次分配 true loggedIn=true;

现在,如果用户按下主页按钮,loggedIn 标志将为 false,并且当恢复应用程序时,将调用登录对话框。

于 2013-03-14T12:30:21.270 回答
0

假设您有两个活动 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()。除非活动被破坏,否则它不会再次被创建。

于 2013-03-14T12:08:41.163 回答
0

您可以创建一个活动来处理身份验证过程并调用它 (A)。并让您当前的活动为(B)和(C)。所以,事情是这样的:

1- 活动 (A) 是启动器。

2-添加android:noHistory="true"<activity>manifest.xml 中的活动 (A) 标记

3- 从 (A) 您可以导航到 (B) 然后到 (C)。

4- 从 (C) 您可以导航回 (B),但您将无法导航回 (A)。

于 2013-03-14T12:35:50.367 回答
0

您可以在按下主页键时设置变量

@Override

public boolean onKeyDown(int keyCode, KeyEvent event) {

   if(keyCode == KeyEvent.KEYCODE_HOME)
    {
     fromHome = true;
    }

return false;
};

并在您从此活动导航时设置变量 false

fromHome = false;

并检查标志OnResume()

于 2013-03-14T12:37:30.873 回答
0

在我看来,您实际上要跟踪的是应用程序中“已启动”活动的数量:#(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();

于 2013-03-14T13:27:41.210 回答