一.概述
通過學習本篇文章厅须,你將學會:
1.Activity的生命周期
2.Activity生命周期的交互設計思想
3.onSaveInstanceState方法和onRestoreInstanceState方法作用和調用時機
4.Activity的啟動模式
5.Activity之間的數據交互
6.啟動系統(tǒng)中常見的Activity
二.Activity的生命周期
Activity是Android提供的四大組件之一,是進行Android開發(fā)必不可少的組件。我們可以把它理解為可以和用戶直接直接進行交互的載體,就是能實實在在看得見的界面。學習Activity,我們首先需要了解它的一個生命周期,Android官方文檔給出的生命周期:
從上圖可以看到宛裕,Activity的基本生命周期是:onCreate--->onStart--->onResume--->onPause--->onStop--->onDestory,可以記憶成“創(chuàng)始人论泛,盤絲洞”揩尸。下面講一下每個函數的作用:
onCreate:當Activity第一次被創(chuàng)建的時候調用此方法,一般在此方法中進行控件的聲明,添加事件等初始化工作孵奶。
onStart:當Activity被顯示到屏幕上的時候調用此方法疲酌,但是還沒出現在前臺,我們還看不到,無法與Activity交互朗恳。
onResume:當Activity能夠被操作之前,也就是能夠獲得用戶的焦點之前調用此方法.
onRestart:當Activity被停止后又被再次啟動之前調用此方法.接著將調用onStart()方法
onPause:當Activity失去焦點湿颅,去重新開啟另外一個活動的時候調用,可以在這里做一些數據的的保存和資源的釋放粥诫,但是不能做耗時操作
onStop:此Activity已經不可見了油航,但是Activity對象還在內存中,沒有被銷毀怀浆。這個階段的主要工作也是做一些資源的回收工作谊囚。
onDestory:此Activity被銷毀,不可見执赡,我們可以將還沒釋放的資源釋放镰踏,以及進行一些回收工作
三.Activity生命周期的交互設計思想
1.A啟動B,然后從B返回A生命周期會怎么調用:
onPause(A)--->onCreat(B)--->onStart(B)--->onResume(B)--->onStop(A)
思考:
1.為什么先調用第一個Activity的onPause()方法,然后再調用第二個Activity的onCreate()
2.為什么不是先調用A的onStop方法結束了再去調用B的onCreate
解答:
1.假如有這樣一個情況,你正在使用APP聽音樂,突然來了一個電話,那么當然需要先暫停音樂,然后進行電話的處理沙合。所以這就是onPause()方法的作用奠伪,可以用來保存當前的各種信息.可以在這個APP的onPause()方法中實現暫停音樂的邏輯,然后再處理電話的業(yè)務處理,這就是這個方法的設計之初
2.根據上面生命周期相關方法的作用我們知道首懈,只有當A完全不可見的時候activity才會調用onStop方法绊率,而B只有在調用onResume的時候才是可見獲取到焦點可操作的,因此需要等到B調用完onResume才會調用A的onStop究履。同時滤否,也是谷歌對安全性的考慮,假如先調用第一個Activity的onStop()方法,那么此時第一個Activity將不可見,如果接下來調用第二個Activity的一系列創(chuàng)建方法失敗了,那么就會導致這兩個Activity都沒顯示在屏幕上,就會出現黑屏等不友好界面.如果是調用完第二個Activity一系列創(chuàng)建方法后,再調用第一個Activity的onStop()方法,就會避免這種情況的發(fā)生。
2.A啟動B(Dialog風格的Activity)最仑,生命周期會怎么調用:
onPause(A)--->onCreate(B)--->onStart(B)--->onResume(B)
注意:如果A只是彈出dialog對話框的時候藐俺,A不會回調onPause。
四.onSaveInstanceState方法和onRestoreInstanceState方法作用和調用時機
Activity的onSaveInstanceState() 和 onRestoreInstanceState()并不是生命周期方法盯仪,它們不同于 onCreate()紊搪、onPause()等生命周期方法蜜葱,它們并不一定會被觸發(fā)全景。當應用遇到意外情況時由系統(tǒng)去銷毀一個activity的時候比如因系統(tǒng)資源配置發(fā)生改變或者內存不足導致的activity的銷毀。我們看下面這張圖:
我們可以看到:由于activity是在異常情況下終止的牵囤,系統(tǒng)會調用onSaveInstance來保存當前activity狀態(tài)爸黄,這個方法的調用時機是在onStop之前。當activity重新創(chuàng)建后揭鳞,系統(tǒng)會調用onRestoreInstanceState炕贵,并且把activity銷毀時onSaveInstanceState方法保存的Bundle對象作為參數同時傳遞給onRestoreInstanceState和onCreate方法,onRestoreInstanceState會在onCreate之后野崇,onResume之前調用称开。
注意:?通常onSaveInstanceState()只適合用于保存一些臨時性的狀態(tài),而onPause()適合用于數據的持久化保存。
五.Activity的啟動模式
Activity有四種啟動模式:standard鳖轰,singleTop清酥,singleTask,singleInstance
1.standard:標準模式蕴侣,也是默認的啟動模式焰轻,啟動activity時直接創(chuàng)建新的實例并壓入啟動它的任務棧頂。
2.singleTop:單頂模式昆雀,棧頂復用模式辱志,該模式唯一與standard不同的就是,如果啟動singleTop模式的activity時發(fā)現當前任務的棧頂已經存在著這個activity的實例狞膘,那么就不會創(chuàng)建新的實例揩懒,其他的跟標準模式一樣。
3.singleTask:單任務模式挽封,棧內復用模式旭从,當我們將要啟動該模式的activity時,系統(tǒng)會判斷當前是否有它想要的任務棧:沒有它要的任務棧 系統(tǒng)會新創(chuàng)建一個任務场仲,并將該activity實例化作為該任務的根activity和悦。有它要的任務棧 這時候系統(tǒng)會找到該任務棧,如果任務棧里只有它自己則直接調用該activity實例的onNewIntent()方法渠缕。如果任務棧中它的上方還存在別的activity鸽素,那么這些activity會被全部彈出棧。
4.singleInstance:單例模式亦鳞,會為activity單獨創(chuàng)建一個任務并能夠復用馍忽。但是該模式的activity不允許其他activity跟自己存在于同一個任務中,由此 activity 啟動的任何 activity 均會被在其他的任務中打開燕差。
六.Activity之間的數據交互
1.通過Intent的putExtra方法傳遞JAVA八大基本類型及其數組類型等:
intent.putExtra("name","zhangsan");//發(fā)送
getIntent().getStringExtra("name");//接收
2.通過Bundle將數據達成一捆進行傳遞? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //發(fā)送? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Bundle bundle =new Bundle();? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?bundle.putString("name","zhangsan");? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?bundle.putInt("age",23);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?intent.putExtras(bundle);
//接收? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
intent.getStringExtra("name")
3.使用Bundle對象的putSerializable()方法
新建一個Person實現Serializable遭笋,通過bundle的putSerializable("person",person);?intent.putExtras(bundle);
Person person = (Person) intent.getSerializableExtra("person");
七.啟動系統(tǒng)中常見的Activity
1.打開瀏覽器網頁:
Intent intent =new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
2.打開相冊:
Intent intent =new Intent();
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivity(intent);
3.打開發(fā)送短信界面:
Intent intent =new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT,"Hello World !");
startActivity(intent);
4.打開撥號界面:
Intent intent =new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse("tel:110"));
startActivity(intent);
八.總結
以上就是關于activity的知識點,如有不足或者錯誤的地方徒探,請指正瓦呼。不管怎樣,代碼的東西不只是需要多看测暗,更需要通過自己動手去寫去熟悉代碼才能有更深的印象央串,更好更全面的了解。這是在簡書上的第一篇文章碗啄,用的不是很熟練质和。