編輯:Android編程入門
PS:寫一發關於Activity的生命周期,也算是面試的重點內容.
學習內容:
1.Activity的生命周期
2.面對多種情況的時候Activity的生命周期
3.onSaveInstanceState()方法的調用
1.Activity的生命周期
Activity的生命周期是Android中需要掌握的重點部分..也就此簡單的介紹一下..順便自己也捋一捋概念上的東西..
返回棧的概念和流程圖:
Android中Activity的管理是由一個棧區進行管理的.在默認情況下,我們每次啟動一個新的Activity的時候.他都會在返回棧中入棧.並且處於棧頂的位置.而我們每次在退出一個Activity的時候,或者是使用finish函數的時候.當前的Activity會進行出棧操作.那麼棧頂位置就成為了前一個Activity系統總是會將棧頂位置的Activity顯示給用戶.
這個流程圖就是Activity的管理方式..
Activity的相關狀態
i.運行狀態
運行狀態的Activity.運行狀態的Activity一般都是直接與用戶進行交互的Acticity.也是處於棧頂位置的Activity.系統一般情況下是不會回收這個Activity的.
ii.暫停狀態
暫停狀態的Activity不再處於棧頂位置,但是仍然處於可見狀態的時候,這個Activity也就進入了暫停狀態.這種的Activity還是挺常見的.一般我們在操作一個Activity的時候.比如說系統彈出了一個新的對話框.這個對話框屬於一個新的Activity.但是這個新的Activity並沒有完全的覆蓋住了屏幕.那麼原來的那個Activity這個時候就處於了暫停狀態.暫停狀態的Activity系統一版狀態下也是不會主動去回收的.(雖然活動暫停,但是仍然處於可見狀態.如果進行了回收,會使得用戶的體驗性差).但是並不代表任何情況下都不會被回收.
iii.停止狀態
停止狀態的Activity.停止狀態的Activity也不再處於棧頂位置.並且已經完全不再可見了.雖然系統仍然保存著相應的狀態和變量.但是一旦其他應用也需要使用內存的時候,那麼處於停止狀態下的Activity也就會被系統自動進行回收了.
iv.銷毀狀態
一般情況下Activity在棧區中被移除的時候,Activity也就進入了銷毀狀態.等待系統的回收,釋放資源和內存.
Activity的生存周期
i.onCreate()方法.
這個方法在Activity在第一次被創建的時候進行調用.一些相關的初始化操作都在這個方法內部完成.
ii.OnDestory()
這個方法是與onCreate()方法是相互對應的.這個方法用於銷毀Activity.釋放資源.
這兩個方法之間的Activity是一個完整的生存周期
iii.onStart()
這個方法使得Activity由不可見狀態成為可見狀態.
iv.onStop()
與onStart()方法形成對應關系.當活動完全不可見的時候進行調用.
這兩個個方法之間的Activity是一個可見的生命周期
v.onResume()
這個方法表示當前的Activity已經可以與用戶進行交互了.活動處於棧頂狀態.
vi.onPause()
與onResume()方法形成對應關系.這個方法在系統准備去啟動或者恢復另一個活動的時候調用。我們通常會在這個方法中將一些消耗CPU 的資源釋放掉,以及保存一些關鍵數據,但這個方法的執行速度一定要快,不然會影響到新的棧頂活動的使用。(注:onPause()方法調用之後不一定會去調用onStop()方法.取決於新Activity的顯示方式,在下面會做出解釋).
這兩個方法之間的Activity是一個前台生存周期,也就是說當前的Activity可以與用戶進行交互.
vii.onRestart()
這個方法的調用是當Activity從停止狀態到運行狀態時需要調用的方法.
上一張流程圖..
以上就是關於Activity的生命周期的一個簡單的介紹..下面來看一看相關的實例.
2.面對多種情況下Activity的生命周期流程
當MainActivity被創建的時候方法的調用過程:
MainActivity的創建會調用的方法:
onCreate(); onStart(); onResume();
當我們點擊第一個按鈕的時候,開啟一個新的Activity(我們稱為Activity1).當Activity1被創建的時候方法的調用過程是這樣的.
首先Activity1調用的方法如下:
Activity1的回調方法如下:
onCreate(); onStart(); onResume();
MainActivity的回調方法:
MainActivity被Activity1覆蓋之後回調方法的調用 onPause(); onStop();
這時MainActivity已經執行了上面的一些方法..
當我們退出Activity1的時候.MainActivity的執行方法如下:
當我們退出Activity1.回到MainActivity的時候方法的調用 onRestart(); onStart(); onResume();
這裡我們可以看到onCreate()方法就不會被執行了.這種情況的前提是我們手機的內存空間是充足的.
我們在來看另外一種情況,比如說我們開啟了一個應用,然後進入了一個Activity界面中,然後我們這時點擊了home鍵進行了退出操作,並且沒有清理手機的內存.這個時候我們去玩手機游戲,並且這個手機游戲會占用相當多的內存空間.然後我們玩完之後,如果我們再次返回前一個我們開啟的那個應用的時候,他仍然會顯示那個Activity的頁面.那麼這個時候這個Activity又執行了哪些方法呢?
我們知道手游是相當耗費內存的.按照上面的那個流程圖來看..如果其他有優先級的應用需要使用內存空間的時候,並且系統空間並不是很足的時候.就需要殺掉進程.釋放那些已經不再顯示的Activity.也就是處於onStop()狀態的時候.因此當我們如果再次回到那個應用的Activity的界面的時候.就需要重新調用onCreate()方法對Activity進行重新創建.然後再去執行onStart().onResume()。
我們接著看上面的另外一種情況,就是我們去點擊第二個按鈕的時候,彈出的對話框Activity(這裡稱為Activity2).我們來看看這種情況.當我們點擊第二個按鈕的時候Activity2的回調方法過程.
Activity2的回調方法: onCreate(); onStart(); onResume();
Activity2的創建仍然沒有什麼太大的區別..還是這三個方法的調用.那麼我們來看看MainActivity的回到方法:
MainActivity的回調方法: onPause();
這裡我們可以看到MainActivity只是調用了一個方法.onPause()方法.並沒有去調用onStop()方法了.因為MainActivity仍然處於一個可見的狀態.雖然我們啟動了一個新的Activity,但是Activity2並沒有完全的覆蓋MainActivity,因此MainActivity只需要去調用onPause()方法.當我們點擊回退的時候,MainActivity只會去調用onResume()方法了.
3.onSaveInstanceState()方法
前面我們已經說過,當一個活動進入到了停止狀態,是有可能被系統回收的。那麼如果應用中有一個活動A,用戶在活動A的基礎上啟動了活動B,活動A就進入了停止狀態,這個時候由於系統內存不足,將活動A 回收掉了,然後用戶按下Back 鍵返回活動A,會出現什麼情況呢?其實還是會正常顯示活動A的,只不過這時並不會執行onRestart()方法,而是會執行活動A的onCreate()方法,因為活動A 在這種情況下會被重新創建一次。
但是這樣會導致的情況就是,這個新創建的Activity是無法保存用戶上次輸入的相關信息的.比如說,用戶在一個文本框中輸入了相關內容然後走了上面的情況.被回收之後,只能重新進行創建,那麼原來用戶在文本框中輸入的相關內容也就不復存在了.這樣就會使得用戶的體驗性較差.那麼我們如何去記錄用戶上一次的操作的相關信息呢?那麼就是使用onSaveInstanceState()方法了.
我們知道Activity創建的時候會調用onCreate()方法.onCreate()方法中存在一個Bundle對象.默認情況下,這個對象的數據是空的.但是如果我們需要保存上一次用戶的相關操作,一些數據信息,那麼就需要使用這個對象了.
我們只需要這樣..
@Override protected void onSaveInstanceState(Bundle State) { super.onSaveInstanceState(outState); String data = "需要保存的數據"; State.putString("data_key", data); }
通過這個方法將數據信息進行保存,那麼恢復的時候就可以這樣..
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); if (savedInstanceState != null) { String data = savedInstanceState.getString("data_key"); } //取出數據之後,在這裡進行恢復. }
這樣就可以通過使用這個方法保存上次用戶輸入的一些數據信息,如果在面對Activity需要重新創建的時候,將數據進行取出,然後重新賦給Activity這樣就可以使得用戶上次輸入的數據會得以保存.使得Activity對用戶的體驗更加的良好,,
Android Hello World 實例讓我們開始真正的基於Android框架編程。在開始使用Android SDK寫第一個示例之前,請確保你已經按照
SimpleAdapter:可顯示文字加圖片activity_activitysimple.xml<?xml version=1.0 encoding=utf-8?
第一種:匿名內部類作為事件監聽器類 大部分時候,事件處理器都沒有什麼利用價值(可利用代碼通常都被抽象成了業務邏輯方法),因此大部分事件監聽器只是臨時使用一次,所
這個月裝逼有點少了,為什麼呢,因為去考軟件射雞師了,快到兒童節了,趕緊寫篇博紀念一下逝去的青春,唔,請忽略這句話。 二維碼其實有很多種,但是我們常見的微信使用的