如何詳解 Activity 的生命周期?

我指的不是framework層的東西,而是最基礎的Activity生命周期。

按下home、back、電源鍵、進程管理器效果?

橫豎屏、輸入鍵盤、ScreenSize?

onSaveInstanceState和onRestoreInstanceState執行時機?

SingleTop、SingleTask、SingleInstance方式時的onNewIntent()?

最近在複習,好像不同的手機系統和版本,有不同的生命周期,越來越暈乎了。

發現,中國開發者水平比美國低,原因不是我們不努力,而是沒有精品學習資料和平台,大家有好的學習方式可以共享。

謝謝!

----------------------------------------------------------------------

首先,謝謝大家的回答。

因為我每工作一段時間後,都會定期回顧和提煉一下,然後更新到雲筆記當中,以備查用。而Activity算是Android最最基礎的東西了吧,我覺得在UI層上,關於Activity生命周期的東西,也就這四點了吧(當然了,歡迎大家補充),所以我有針對的,打算深挖他們一下。在提問之前,我已經看了關於它的教學視頻和書籍,除了百度和Google之外,也自己動手寫了一個Activity打日誌。

但看到這麼多知識點,發現他們之間是有衝突的:

就拿橫豎屏切換來講吧。

1,不配置configchanges,我拿華為榮耀7和Nexus3測試,發現無論是切橫豎屏都只重新創建一次Activity,而這跟我在網上找到的所有教程和博客衝突,他們都告誡豎屏要重新create兩次,當然了也可能是我沒找到優質資源。

2,configchanges設置,在3.2之後多了個ScreenSize,這時我只配置Orientation和ScreenSize,橫豎屏就不會出現重新創建問題,而3.2之下是需要keyboardhidden,那是不是說3.2之後避免重新create keyboardhidden就不需要配置了?

這是我遇到的問題中的兩個,但這在我所找過的教程中,都沒有解答的,所以我在這裡提問了,希望有人能給詳解一下。

至於大家普遍噴的「中國開發者水平比美國低,原因不是我們不努力」,我也無話可說,我自始至終都認為,環境比人的努力要重要,這是我的個人觀點。

還有,大家想怎麼噴都可以,咱們這是討論技術的,如果不能給我解答,像前面的幾位那樣,給幾個鏈接亦可以。

謝謝!


『中國開發者水平比美國低』姑且不談這句話以偏概全,原因也不是你說的那樣;

英語水平差怪誰??

官方文檔

http://developer.android.com/intl/zh-cn/reference/android/app/Activity.html

http://developer.android.com/intl/zh-cn/guide/components/activities.html

PS:現在官方文檔有部分都已經漢化了,比如第二個鏈接;你看了么。

google搜索結果:

Android application and activity life cycle

Activity Lifecycle

Lesson 24. Activity Lifecycle, example about changing states with two Activities

美國人能看的資料你就不能看嗎?

--------------------------------------------------------------------------------------------

題主補充了問題,onNewIntent的執行時機;關於這個API文檔也解釋的很清楚;看API文檔就知道了;具體解釋可以參考我之前的回答:為什麼Android返回上一頁時不調用OnNewIntent方法?? - weishu 的回答

--------------------------------------------------------------------------------------------------

這是我在知乎上第一個如此充滿戾氣的回答,我承認語氣不對;但是如果我只是掛個鏈接,回答一下問題,隔幾天又有人上來問『有大神解釋下XXX么,我覺得中國開發者水平比美國低,原因不是我們不努力』云云,廣大知友說該怎麼辦?授人以魚不如授之以漁。我們不是你的親人父母,所以也沒有義務去呵護你的自尊心。

最後回到問題,90%的問題可以通過官方文檔和API文檔搞定,搞不定不是還有搜索引擎么,就算百度不好它知道的也比你多。如果都搞不定,自己寫個demo驗證一下也不是麻煩事。

如果題主用知乎搜索一下onNewIntent,就會搜到我上面說的結果:

還需要強調一點的是,遇到問題第一反應不是搜索引擎,而是查閱API文檔。


其實就是不努力。。。

你問的這些個問題,可能是沒有人把他們聚合在一起回答,但是每個知識點你都可以在百度這樣的垃圾搜索引擎中搜到很多,然後自己在寫代碼驗證一下就OK了。

平台之間、國產Rom之間,可能會有差異,不過不會太大。

沒有貶低任何人的意思,國外開發者比較國內開發者的優勢其實就是英文,那些技術博客、Android官網、公開課、Google開發者大會視頻,我們其實是都可以看到的(VPN是Android開發者必備的),再者,國內這幾年的Android技術博客和分享其實是很豐富的,這個你平時可以多注意一下。

最後,多寫代碼!多讀源碼(RTFS)


提問語氣稍偏激,已有不少答主批判了,我就不再說題主了。但看到有一位答主范大蝦,他的評論是說「技術不咋的又愛寫博文裝逼」這話聽著很是刺耳,我忍不住想多說兩句

其實有很多的博主,他們在白天還要上班,晚上回家寫博客,那時你可能在看電視、刷微博、微信,而博主正在用心寫博主,甚至到深夜。難免會有個人理解或認知得不到位,但誰能沒有錯誤,技術是在不斷學習、總結與實踐中提升。你不但不感謝博主們的無私奉獻精神,而是用「裝逼」來評價,這是很寒心的。就算你發現博主存在的錯誤,及時留意探討,大家共同進步,博主也會感謝你。退一步說,網上的確各種資料良莠不齊,自己沒有判斷真假的能力,不要去肆意地批判別人,其實只要多看幾篇不同博主寫的文章,多做對比分析,好的東西還是會被大家頂上去的。

--------------------------------------------------------- 分割線 -----------------------------------------------

接著,回到正題,關於Activity生命周期,對於網上也有大量博客講到這個問題,

Activity生命周期:

這幅圖比較清晰,就不細說,下面我就說說圖上沒有的吧

(一)Activity與進程的關係

作為應用開發者,接觸更多的是Activity/Service/Broadcast/ContentProvider這四大組件以及線程,往往對於進程沒有很多的概念,這是google有意為之,除非在AndroidManifest.xml文件中配置android:process屬性,否則一般情況下一個App是運行在一個進程中。

在Android系統啟動的過程中,便創建好Android上層應用的環境,即Android Runtime,一切的應用都是運行在Android Runtime這個層面之上。而進程對於App來說是完全透明的,在Activity進入生命周期之前,會先創建好進程,可以把進程理解為Activity的載體。一個進程中可以有多個Activity,而一個Activity必須且只能存在一個進程里;進程里可以不存在任何Activity,而Activity不能離開進程而孤立存在。

(二)home鍵、back鍵、電源鍵、進程管理器

一般情況下

按下home鍵:前台Activity依次回調onPause, onStop;

按下back鍵:前台Activity依次回調onPause, onStop, onDestroy;

按下電源鍵:前台Activity依次onPause, onStop;

對於進程管理器,採用的force-stop的方式,也是直接強殺進程,並且連廣播都會隔斷。

為何我要強調是一般情況呢,

目前android應用市場比較混亂,各種應用商店,各種app,裡面不乏有很多讓手機後台大量消耗CPU,導致手機卡頓,或者在後台偷偷耗電、跑流量的應用。

針對這些情況,國內各大手機廠商都會針對Android有不同程度的定製與優化。這可能會導致那些一般情況的理論與實際有所不同。

比如系統有Low Memory Killer(低內存殺手),在手機內存比較緊張時會強殺應用,這也會導致Activity掛了,這是Android自帶的機制。對於廠商,比如滅屏殺進程,那麼這就可能導致按下電源鍵,Activity的生命周期就玩完了;另外,現在大多數App,攔截返回鍵功能,使其與home鍵效果一致,那麼不排除有對返回鍵的極端優化情形。

(三) 橫豎屏切換

在未做任何處理的情況,旋轉後,Activity生命周期重新運行:onPause, onStop, onDestroy, onCreate, onStart, onRestoreInstanceState, onResume。

而目前,google版本的碎片化非常嚴重,而版本迭代快(今年5月份就能看到Android 7.0),在Android不斷升級與完善的同時也新增不少功能,這就導致同一個功能也需要變更。

另外,還是前面的說的,對於configchange部分廠商會對其行為定製是完全可能的,屏幕的旋轉後重走生命周期是比較卡的一個過程。

(四)launch mode

Activity啟動模式有4種:standard、singleTop、singleTask和singleInstance。相關文章也很多,這裡簡單說下我的理解:

  • standard是默認方式,一個Task中可以有多個相同類型的Activity;
  • singleTop(字面理解單例棧頂),是指task棧頂只會有一個同類型的Activity;
  • singleTask(字面理解單例task),是指不只是棧頂,整個task只會有一個同類型的Activity;
  • singleInstance(字面理解單例實例):不只是整個task只會有一個同類型Activity,而且該task也只有這一個Activity;

對於Activity實例的單例要求是不斷加強: standard &< singleTop &

有了這些簡單鋪墊,再說下題主的問題onNewIntent()的觸發時機是在啟動Activity時卻不需要創建新的Activity實例的情形下觸發。 比如singleTop時,當再次啟動task棧頂的Activity會觸發;singleTask/singleInstance時,再次啟動task的Activity會觸發。

另外,對於一般App盡量少用singleTask和 singleInstance模式,可能會影響用戶體驗。

(五) 結束

建議題主,平時多看看google官方文檔,看Android源碼,多動手寫demo程序,另外,就是學會翻牆。

通過打log來驗證,留給有興趣的不妨試試,finish()方法在onCreate,onStart,onResume等不同地方調用finish()後,Activity走的生命周期也是不同的。


閱讀原文:Android應用框架之Activity-博客-雲棲社區-阿里雲

1.基本結構

一個應用程序通常由多個Activity組成,那麼在應用程序中肯定需要一個容器來盛放這些Activity,必要時通過該容器找到對應的Activity,並進行相關操作。上一篇文章已經講過一個應用程序對應一個ActivityThread,所以自然而然地該容器是ActivityThread在負責維護,這個容器叫做mActivities,是一個數組,裡面的每一項叫做ActivityRecord,一個ActivityRecord對應一個Activity。以上僅僅是應用級別的管理容器,但是很多場景下,系統需要找到某一個特定的Activity,並下發相關數據比如事件分發。所以還必須在系統層面再維護一個容器,這個容器存放在Activity Manager Service,對應的容器叫做mHistory,對應的每一項叫做HistroyRecord。
每個Activity必須依靠在進程中,每個進程對應一個AMS中的ProcessRecord,通過這個ProcessRecord可以找到對應的應用的所有Activity,同時還提供了與Activity聯繫的介面IActivityThread。所以整個Activity的管理框架如下圖所示:

2.Activity啟動過程

在Launch Activity時,AMS將對應的HistoryRecord作為token傳遞到客服端和客服端的Activity建立聯繫。在AMS中Activity狀態變化時,將通過該聯繫找到客服端的Activity,從而將消息或者動作傳遞應用程序面對的介面:xxxActivity。整個Activity的啟動過程大致可以分為以下幾個步驟:

  • 發起startActivity(intent)請求
  • AMS接收到請求後,創建一個HistroyRecord對象,並將該對象放到mHistory數組中
  • 調用app.thread.scheduleLaunchActivity()
  • AMS創建ActivityRecord對象,將創建的Activity放入到ActivityRecord,再將其放入到mActivities
  • 發起Activity的onCreate()方法

對應的步驟如下圖所示:


其實真的不想回答,因為這方面資料太多了,不過剛好我博客有這個系列,直接貼給你做下參考吧:

Activity生命周期詳解一

Activity生命周期詳解二

onSaveInstanceState onRestoreInstanceState

Android Activity/Fragment Lifecycle

最後,實踐出真知,親自動手,打個Log調試下,自己才能真正的理解這些基礎!


第一時間看了weishu的回答,感覺好大戾氣。。。

然後看了你問的問題,我明白大家為什麼要噴你了。。。

有問題,先查官方文檔,再搜索,這種基礎的技術問題請別在知乎問。

「中國開發者水平比美國低」?暫不論這個話題本身,先問下題主是怎麼得出這個結論的?從知乎上看到的?還是百度的?

編碼,要有一顆我自己可以搞得定的心,深追其中,專研問題的心。

不要輕易提問。


其實知道個大概就行了,用到的時候自然會想起來,直接寫還是查資料都行


這個東西,我想在這裡沒人會具體回答你,開發必用,也一直圍繞著生命周期寫代碼。如果這個不知道,那肯定就是基礎的問題了,建議多看看博客,或者去官網看看就知道了,一張圖就讓你明白的事情


資料也不一定是對的,我也做安卓開發的,搜到沒用而且錯誤的資料多的去了,哪些技術不咋的又愛寫博文裝逼的人家也是為了紀錄一下學習過程,不能全部照搬,可以翻牆到外網去照照資料,像你說的生命周期的,api文檔裡面就有,英文不過關的話可以下翻譯工具,大概在琢磨一下就可以看懂了


直接去看Android developer啊,那上面的英文是最簡單的,完全無廢話。


看了回答 ,我想這就是中國技術論壇和國外技術論壇 stackoverflow最根本的區別: 一個認真的問,但是下面大部分是吐槽,嫌棄。很失望,即使說知乎是相對比較好的論壇,CSDN還是好一點,即使雷同的信息比較多,但是,技術氛圍還是比較濃厚的。


推薦閱讀:

奶粉追溯系統到底保證了什麼,有必要開發嗎?
給網站加一個殼封裝成APP?
Zine 的目標用戶是什麼人?它的產品邏輯是什麼?
為什麼沒有把手機變成暖寶寶的APP?

TAG:互聯網 | Android開發 | 移動開發 | Activity |