2016-07-30 181 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

相關問題