Android查缺補漏--Activity生命週期和啟動模式

來源:互聯網
上載者:User

標籤:出現   5.0   --   多次   roi   效果   pause   coding   寫入   

一、生命週期
  • onCreate():啟動Activity時,首次建立Activity時回調。
  • onRestart():再次啟動Activity時回調。
  • onStart():初次開機Activity時在onCreate()之後被回調,再次啟動時在onRestart()之後被回調。此時Activity已經可見但還沒出現到前台不能與使用者互動。
  • onResume():在onStart()之後被回調,此時Activity已經完全可見並且可以與使用者互動。
  • onPause():當使用者返回或者跳轉到下一個Activity時會回調此方法,表示正在停止當前Activity,但此時Activity依然可見,通常緊接著會回調onStop()。
  • onStop():表示Activity即將停止。
  • onDestroy():表示Activity被銷毀。

值得注意的地方:

  1. onStart和onResume咋看起來差不多,但有一些細微的差別,onStart表示Activity雖然此時已經可見但並沒有完全顯示到前台,onResume表示此時已經完全顯示到前台了,並可以與使用者互動了,onPause和onStop區別類似於此。
  2. 當ActivityA啟動ActivityB時,他們的生命週期方法執行順序如下:
    A.onPause->B.onCreate->B.onStart->B.onResume->A.onStop

日誌如下:

12-05 17:18:24.666 778-778/cn.codingblock.androidadvancestudy I/MainActivity: onPause: 12-05 17:18:24.674 778-778/cn.codingblock.androidadvancestudy I/BActivity: onCreate: 12-05 17:18:24.687 778-778/cn.codingblock.androidadvancestudy I/BActivity: onStart: 12-05 17:18:24.688 778-778/cn.codingblock.androidadvancestudy I/BActivity: onResume: 12-05 17:18:25.006 778-778/cn.codingblock.androidadvancestudy I/MainActivity: onStop: 
1、普通情況下的Activity生命週期方法執行順序:
  • 啟動一個Activity:onCreate()->onStart()->onResume();
  • 當在當前Activity中跳轉到下一個頁面時(或者被使用者切換到後台時),當前的Activity會被暫停:onPause()->onStop();
  • 然後再返回這個Activity時:onRestart()->onStart()->onResume();
  • Activity退出時:onPause()->onStop()->onDestroy()。
2、橫豎屏切換時Activity生命週期方法執行順序:
  • onPause()->onSaveInstanceState()->onStop()->onDestroy()->onCreate()->onStart()->onRestoreInstanceState()->onResume()。

在橫豎屏切換時Activity會先被銷毀,然後再重新建立,在銷毀時onPause()被調用之後會調用onSaveInstanceState(Bundle bundle),此時我們就有機會將一些需要恢複的資訊寫入onSaveInstanceState()的Bundle參數中,在Activity被重建時,調用onStart()之後會調用onRestoreInstanceState(Bundle bundle),此時我們就可以在onRestoreInstanceState()用來恢複一些必要的資訊,而它的參數就是我們在onSaveInstanceState寫入的參數。

3、系統記憶體不足導致低優先順序的Activity被回收時的生命週期方法執行順序

此種情況和第二種橫豎屏切換時的情況查不多,也會執行onSaveInstanceState()和onRestoreInstanceState()。

二、四種啟動模式
  • standard:預設的啟動方式,Activity可以被多次執行個體化,即同一個棧中可以存在多個Activity執行個體。

如果用ApplicationContext去啟動standard模式的Activity的時候會報錯,這是因為此模式的Activity預設會進入啟動它的Activity所屬的任務棧中,而非Activity類型的Context並有沒有任務棧。解決辦法就是在用ApplicationContext啟動Activity時指定FLAG_ACTIVITY_NEW_TASK即可,這樣在啟動Activity時就會為它建立一個新棧。

  • singleTop:棧頂複用模式。以singleTop模式啟動的Activity如果已經有一個樣本存在==棧頂==,那麼再啟動這個Activity時就會重用這個樣本,並調用onNewIntent()方法。如果不在棧頂,則會建立新的樣本,效果如standard一致。

  • singleTask:棧內複用模式。此模式只允許一個棧中只存在一個該Activity的執行個體,啟動此模式的Activity時,如果棧中沒有該Activity的執行個體,則會建立新的執行個體。如果棧中已經存在該執行個體了,系統會銷毀在其之上的所有Activity,最終讓該Activity執行個體置於棧頂,並回調onNewIntent()方法。

  • singleInstance:單一實例模式。該模式的Activity只在一個獨立的任務棧中開啟,並且這個新的任務棧中有且只有這一個執行個體。當再次啟動該Activity執行個體時,會重用已存在的任務和執行個體(並調用onNewIntent)。而該Activity啟動的其他Activity會自動運行與另一個任務棧中。

singleInstance和singleTask的區別:

  • singleInstance在同一個時刻,在系統中只會存在一個執行個體,而singleTask模式的Activity可以有多個執行個體,只要這些執行個體在不同的任務棧中即可。
  • 比如應用A啟動了一個singleInstance的Activity,而應用B也啟動了這個Activity,那麼會重用已經啟動的執行個體。

最後想說的是,本系列文章為博主對Android知識進行再次梳理,查缺補漏的學習過程,一方面是對自己遺忘的東西加以複習重新掌握,另一方面相信在重新學習的過程中定會有巨大的新收穫,如果你也有跟我同樣的想法,不妨關注我一起學習,互相探討,共同進步!

參考文獻:

  • 《Android開發藝術探索》
  • 《Android開發進階從小工到專家》

Android查缺補漏--Activity生命週期和啟動模式

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.