我指的不是framework層的東西,而是最基礎的Activity生命周期。
* 按下home、back、電源鍵、進程管理器效果?
* 橫豎屏、輸入鍵盤、ScreenSize?
* onSaveInstanceState和onRestoreInstanceState執行時機?
* SingleTop、SingleTask、SingleInstance方式時的onNewIntent()?
最近在復習,好像不同的手機系統和版本,有不同的生命周期,越來越暈乎了。
原文出處:鏈接:https://www.zhihu.com/question/41352677/answer/91030381
關于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有不同程度的定制與優化。**這可能會導致那些一般情況的理論與實際有所不同。
比如系統有L**ow 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 <singleTask < singleInstance**
有了這些簡單鋪墊,再說下題主的問題**onNewIntent()**的觸發時機是在啟動Activity時卻不需要創建新的Activity實例的情形下觸發。 比如singleTop時,當再次啟動task棧頂的Activity會觸發;singleTask/singleInstance時,再次啟動task的Activity會觸發。
**另外,對于一般App盡量少用singleTask和 singleInstance模式,可能會影響用戶體驗。**
**(五) 結束**
建議題主,平時多看看google官方文檔,看Android源碼,多動手寫demo程序,另外,就是學會翻墻。
通過打log來驗證,留給有興趣的不妨試試,finish()方法在onCreate,onStart,onResume等不同地方調用finish()后,Activity走的生命周期也是不同的。
- 前言
- Android系統的體系結構
- Dalvik VM 和 JVM 的比較
- Android 打包應用程序并安裝的過程
- Android ADB工具
- Android應用開發
- Android UI相關知識總結
- Android 中window 、view、 Activity的關系
- Android應用界面
- Android中的drawable和bitmap
- AndroidUI組件adapterView及其子類和Adapter的關系
- Android四大組件
- Android 數據存儲
- SharedPreference
- Android應用的資源
- 數組資源
- 使用Drawable資源
- Material Design
- Android 進程和線程
- 進程
- 線程
- Android Application類的介紹
- 意圖(Intent)
- Intent 和 Intent 過濾器(Google官網介紹)
- Android中關于任務棧的總結
- 任務和返回棧(官網譯文)
- 總結
- Android應用安全現狀與解決方案
- Android 安全開發
- HTTPS
- 安卓 代碼混淆與打包
- 動態注入技術(hook技術)
- 一、什么是hook技術
- 二、常用的Hook 工具
- Xposed源碼剖析——概述
- Xposed源碼剖析——app_process作用詳解
- Xposed源碼剖析——Xposed初始化
- Xposed源碼剖析——hook具體實現
- 無需Root也能Hook?——Depoxsed框架演示
- 三、HookAndroid應用
- 四、Hook原生應用程序
- 五、Hook 檢測/修復
- Android 應用的逆向與加固保護技術
- OpenCV在Android中的開發
- Android高級開發進階
- 高級UI
- UI繪制流程及原理
- Android新布局ConstraintLayout約束布局
- 關鍵幀動畫
- 幀動畫共享元素變換
- Android異步消息處理機制完全解析,帶你從源碼的角度徹底理解
- Android中為什么主線程不會因為Looper.loop()里的死循環卡死?
- 為什么 Android 要采用 Binder 作為 IPC 機制?
- JVM 中一個線程的 Java 棧和寄存器中分別放的是什么?
- Android源碼的Binder權限是如何控制?
- 如何詳解 Activity 的生命周期?
- 為什么Android的Handler采用管道而不使用Binder?
- ThreadLocal,你真的懂了嗎?
- Android屏幕刷新機制