2016-07-30 137 views
1

在我的android应用程序中,有10个活动。我通过号码识别所有这些活动。可以说活动1到活动10.什么是Android应用程序生命周期方法? (不是活动生命周期方法。)

  1. 活动1是启动画面。
  2. 活动2 =登录屏幕
  3. 活动3至10是本书的普通页面。

现在,当我第一次登录到我的应用程序,它显示我的启动画面,然后登录屏幕。我的应用程序询问密码。然后它将我重定向到活动3,这是本书的第1页。现在让我们假设我在第5页,即活动7,然后我突然按下Home按钮,然后应用程序进入背景状态。

现在我想要的是,当我再次打开我的应用程序和我的应用程序在前台时,它不会启动活动7.我想先启动活动2(登录屏幕),然后它要求输入正确的密码。如果用户输入正确的密码,那么只有活动7开始。 所以基本上我的问题是,是否有任何方法来确定我的应用程序是否会进入后台或在开始活动之前在前台进入? (即android应用程序生命周期方法)。因此,我可以首先通过该应用程序生命周期方法启动登录活动。在iOS中,我可以通过应用程序委托生命周期方法来实现这一点。但我怎么能用android做到这一点?

+0

你如何记住iOS上最后一次活动? –

+0

我要将其活动编号保存到共享首选项 – appleBoy21

+1

这里使用相同的概念。一旦用户登录,通过使用意图将他/她转移到相应的活动。 –

回答

1

发生这种情况是因为Activity LifeCycle。当您按下主页按钮关闭应用程序时,会调用当时处于活动状态的相应Activity的onStop()方法。这个方法不会完全破坏Activity,它只会停止它。

通过调用相应Activity的onDestroy()方法销毁Android OS中的活动。但是,不能直接调用onDestroy()方法,因为它是Activity的LifeCycle的一种方法。它由Android OS自动调用。为了确保活动停止后Activity的onDestroy()方法得到调用,我们将在各自Activity的onStop()方法内调用finish()方法。

@Override 
protected void onStop() { 
    super.onStop(); 
    finish(); 
} 

现在,当您再次启动您的应用程序时,它将从开始即启动屏幕开始。

+0

嘿谢谢:) 我认为这是我正在寻找的情况。似乎对我很好。我知道你在说什么。我现在要试试这个。如果发现任何困难,我会尽快回复您。再次感谢 – appleBoy21

+0

欢迎您:) –

+0

如果您的问题已解决,请接受我的回答。 –

0

您可以为此目的扩展Application类。你需要有落实活动生命周期回调是这样的:

public class MyApplication extends Application implements ActivityLifecycleCallbacks { 

    private boolean userLoggedOff; 
    private Handler mHandler; 

    ... 

    @Override 
    public void onActivityResumed(Activity activity) { 
     Log.i("Activity Resumed", activity.getLocalClassName()); 

     if (userLoggedoff) 
      startPasswordActivity() 
     else { 
      mHandler.cancelCallbacksAndMessages(null); 
      userLoggedOff = false; 
     } 
    } 

    @Override 
    public void onActivityPaused(Activity activity) { 
     Log.i("Activity Paused", activity.getLocalClassName()); 

     mHandler.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
        userLoggedOff = true; 
      } 
     }, 5000); 
    } 

    ... 

} 

现在,这里是我们正在努力的是,只要任何活动的onPause()叫我们触发使用处理程序来关闭注销用户延迟事件。只有在任何活动的onResume()在5秒钟内被调用时才能取消该事件(就像您知道的那样,这可以在正常活动切换期间调用,也可以在应用程序来自后台时调用)。

这可能会解决您的问题优雅,我猜。

+0

谢谢shaishav。我觉得很有帮助。但是,假设我误按了home按钮并立即在5秒内启动应用程序,那么我也认为同样的活动将开始......那就是我又想要再次开始我的登录活动的情况 – appleBoy21

+0

因此,您不想给任何头部空间给用户?点击主页按钮和'hasta la vista baby'? :) – Shaishav

+0

对啊...我想要那样的行为 – appleBoy21

1

由于您不想给用户任何空间并希望在应用程序进入后台时立即注销,我们可以使用常规活动生命周期来区分何时应用程序何时到达背景以及何时发生画面切换。您的应用程序类可以是这样的:

public class MyApplication extends Application implements ActivityLifecycleCallbacks { 

    public boolean userLoggedoff; 

    ... 

    @Override 
    public void onActivityResumed(Activity activity) { 
     Log.i("Activity Resumed", activity.getLocalClassName()); 

     if (userLoggedoff) 
      startPasswordActivity() // Make sure you add 'CLEAR_TOP' flag to intent 
    } 

    ... 

} 

让您的“登录”活动,按照下面的模板:

public class Act1 extends Activity { 

    private boolean legitSwitch; 

    ... 

    // Legit app switch 
    private void startNewAct() { 
     legitSwitch = true; 
     ... 
     startActivity() 
    } 


    protected void onPause() { 
     if (!legitSwitch) 
       ((MyApplication) getApplication()).userLoggedOff = true; 
    } 

} 

确保你从你的登录活动设置userLoggedOff布尔为true。希望这可以帮助。现在请记住,按下主页按钮并返回后,上述方法仍然会显示以前的活动,因为我们正在执行应用程序类的onActivityResumed()方法,但会立即启动登录活动,因为用户如何按下主页按钮!

+0

谢谢。明白了你的观点。我会在我的项目中尝试这一点。这是对你的很好的学习。谢谢 – appleBoy21

相关问题