四大組件中的基本概念已經在之前的一篇文章里面提到了挥下,現在就不再贅述(其實后面想想递雀,查閱起來會特別的麻煩,于是還是補充一下好)
Activity:
Activity 是一個負責與用戶交互的組件弊知,Activity 中所有操作都與用戶密切相關握牧,可以通過 setContentView(View)來顯示指定控件容诬。
在一個 android 應用中,一個 Activity 通常就是一個單獨的屏幕沿腰,它上面可以顯示一些控件也可以監(jiān)聽并處理用戶的事件做出響應览徒。
首先是筆試,面試中經常會被考到的生命周期(先上官方圖):
下面是對各方法的解釋:
onCreate(Bundle savedInstanceState):
創(chuàng)建 activity 時調用矫俺。設置在該方法中吱殉,還以 Bundle 的形式提供對以前儲存的任何狀態(tài)的訪問掸冤!
onStart():
activity 變?yōu)樵谄聊簧蠈τ脩艨梢姇r調用。
onResume(): activity 開始與用戶交互時調用(無論是啟動還是重新啟動一個活動友雳,該方法總是被調用的)稿湿。
onPause():
activity 被暫停或收回 cpu 和其他資源時調用押赊,該方法用于保存活動狀態(tài)的饺藤,也是保護現場,壓棧吧流礁!
onStop():
activity 被停止并轉為不可見階段及后續(xù)的生命周期事件時調用涕俗。
onRestart():
重新啟動 activity 時調用。該活動仍在棧中神帅,而不是啟動新的活動再姑。
onDestroy():
activity 被完全從系統(tǒng)內存中移除時調用,該方法被調用
圖中需要注意一下幾點:
1.Activity實例是由系統(tǒng)自動創(chuàng)建找御,并在不同的狀態(tài)期間回調相應的方法元镀。一個最簡單的完整的Activity生命周期會按照如下順序回調:onCreate -> onStart -> onResume -> onPause -> onStop -> onDestroy。稱之為entire lifetime霎桅。
2.當執(zhí)行onStart回調方法時栖疑,Activity開始被用戶所見(也就是說,onCreate時用戶是看不到此Activity的滔驶,那用戶看到的是哪個遇革?當然是此Activity之前的那個Activity),一直到onStop之前揭糕,此階段Activity都是被用戶可見萝快,稱之為visible lifetime。
3.當執(zhí)行到onResume回調方法時插佛,Activity可以響應用戶交互杠巡,一直到onPause方法之前,此階段Activity稱之為foreground lifetime雇寇。
Acitivity一般意義上有四種狀態(tài):
1.當Activity位于棧頂時氢拥,此時正好處于屏幕最前方,此時處于運行狀態(tài)锨侯;
2.當Activity失去了焦點但仍然對用于可見(如棧頂的Activity是透明的或者棧頂Activity并不是鋪滿整個手機屏幕)嫩海,此時處于暫停狀態(tài);
3.當Activity被其他Activity完全遮擋囚痴,此時此Activity對用戶不可見叁怪,此時處于停止狀態(tài);
4.當Activity由于人為或系統(tǒng)原因(如低內存等)被銷毀深滚,此時處于銷毀狀態(tài)奕谭;
假設A Activity位于棧頂涣觉,此時用戶操作,從A Activity跳轉到B Activity血柳,實際應用場景中調用的方法以及調用的順序:
開始時官册,A被實例化,執(zhí)行的回調有A:onCreate -> A:onStart -> A:onResume难捌。
當用戶點擊A中按鈕來到B時膝宁,假設B全部遮擋住了A,將依次執(zhí)行A:onPause -> B:onCreate -> B:onStart -> B:onResume -> A:onStop根吁。
此時如果點擊Back鍵员淫,將依次執(zhí)行B:onPause -> A:onRestart -> A:onStart -> A:onResume -> B:onStop -> B:onDestroy。
至此击敌,Activity棧中只有A介返。在Android中,有兩個按鍵在影響Activity生命周期這塊需要格外區(qū)分下沃斤,即Back鍵和Home鍵映皆。我們先直接看下實驗結果:
此時如果按下Back鍵,系統(tǒng)返回到桌面轰枝,并依次執(zhí)行A:onPause -> A:onStop -> A:onDestroy。
此時如果按下Home鍵(非長按)组去,系統(tǒng)返回到桌面鞍陨,并依次執(zhí)行A:onPause -> A:onStop。由此可見从隆,Back鍵和Home鍵主要區(qū)別在于是否會執(zhí)行onDestroy诚撵。
如何退出 Activity ? 如何安全退出已調用多個
Activity 的 Application键闺?
在 Android 中退出程序比較麻煩寿烟,尤其是在多個 Activity 的程序中,在 2.2 之前可以采用如下代碼退出程序:
此種方法是一種最方便和最簡單的退出程序的辦法辛燥,但是在 2.2 和 2.2 之后就不能用了
一種常用的方法是自定義一個 Activity 的棧筛武,在程序退出時將棧中的所有的 Activity 進行 finish。
還有一些其他的方式挎塌,在這可查看
http://alex-yang-xiansoftware-com.iteye.com/blog/1099207
后臺的 Activity 由于某原因被系統(tǒng)回收徘六,在被系統(tǒng)回收之前保存當前狀態(tài)
重寫 onSaveInstanceState()方法,在此方法中保存需要保存的數據榴都,該方法將會在 activity 被回收之前調用待锈。通過重寫 onRestoreInstanceState()方法可以從中提取保存好的數據
activity 在屏幕旋轉時的生命周期:
不設置 Activity 的 android:configChanges 時,切屏會重新調用各個生命周期嘴高, 切橫屏時會執(zhí)行一次竿音,切豎屏時會執(zhí)行兩次和屎;
設置 Activity 的android:configChanges="orientation"時,切屏還是會重新調用各個生命周期春瞬, 切橫柴信、豎屏時只會執(zhí)行一次;
設置 Activity 的android:configChanges="orientation|keyboardHidden"時快鱼,切屏不會重新調用各個生命周期颠印,只會執(zhí)行 onConfigurationChanged 方法。
activity 的啟動模式:
Standared 模式(默認)
我們平時直接創(chuàng)建的 Activity 都是這種模式的 Activity抹竹,這種模式的 Activity 的特點是:只要你創(chuàng)建了 Activity 實例线罕,一旦激活該 Activity,則會向任務棧中加入新創(chuàng)建的實例窃判, 退出 Activity 則會在任務棧中銷毀該實例钞楼。
- SingleTop 模式
這種模式會考慮當前要激活的 Activity 實例在任務棧中是否正處于棧頂,如果處于棧頂則無需重新創(chuàng)建新的實例袄琳,會重用已存在的實例询件,否則會在任務棧中創(chuàng)建新的實例。 - SingleTask 模式
如果任務棧中存在該模式的Activity 實例唆樊,則把棧中該實例以上的Activity 實例全部移除宛琅, 調用該實例的 newInstance()方法重用該 Activity,使該實例處於棧頂位置逗旁,否則就重新創(chuàng)建一個新的 Activity 實例嘿辟。 - SingleInstance 模式
當該模式 Activity 實例在任務棧中創(chuàng)建后,只要該實例還在任務棧中片效,即只要激活的是該類型的 Activity红伦,都會通過調用實例的 newInstance()方法重用該 Activity,此時使用的都是同一個 Activity 實例淀衣,它都會處于任務棧的棧頂昙读。此模式一般用于加載較慢的,比較耗性能且不需要每次都重新創(chuàng)建的 Activity膨桥。
跟 activity 和 Task 有關的 Intent 啟動方式:
- FLAG_ACTIVITY_NEW_TASK
如果設置蛮浑,這個 Activity 會成為歷史 stack 中一個新 Task 的開始。一個 Task(從啟動它的 Activity 到下一個 Task 中的 Activity)定義了用戶可以遷移的Activity 原子組只嚣。Task 可以移動到前臺和后臺陵吸;在某個特定 Task 中的所有 ActivityNormal總是保持相同的次序。這個標志一般用于呈現“啟動”類型的行為:它們提供用戶一系列可以單獨完成的事情介牙,與啟動它們的 Activity 完全無關壮虫。
2.FLAG_ACTIVITY_CLEAR_TOP
如果設置,并且這個 Activity 已經在當前的 Task 中運行,因此囚似,不再是重新啟動一個這個 Activity 的實例剩拢,而是在這個 Activity 上方的所有 Activity 都將關閉, 然后這個 Intent 會作為一個新的 Intent 投遞到老的 Activity(現在位于頂端)中饶唤。
3.FLAG_ACTIVITY_SINGLE_TOP
如果設置徐伐,并且這個 Activity 已經在當前的 Task 中運行,因此募狂,不再是重新啟動一個這個 Activity 的實例办素,而是在這個 Activity 上方的所有 Activity 都將關閉,然后這個Intent 會作為一個新的 Intent 投遞到老的 Activity(現在位于頂端)中祸穷。
4.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
如果設置這個標志性穿,這個 activity 不管是從一個新的棧啟動還是從已有棧推到棧頂,它都將以 the front door of the task 的方式啟動雷滚。這就將導致任何與應用相關的棧都講重置到正常狀態(tài)(不管是正在將 activity 移入還是移除)需曾,如果需要,或者直接重置該棧為初始狀態(tài)祈远。
以上大概就是的關于Activity的一些知識點呆万,關于生命周期一般都是會經常被問到,所以需要重點記憶