Android四大組件之Activity

一.概述

通過學習本篇文章厅须,你將學會:

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的知識點,如有不足或者錯誤的地方徒探,請指正瓦呼。不管怎樣,代碼的東西不只是需要多看测暗,更需要通過自己動手去寫去熟悉代碼才能有更深的印象央串,更好更全面的了解。這是在簡書上的第一篇文章碗啄,用的不是很熟練质和。

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市稚字,隨后出現的幾起案子饲宿,更是在濱河造成了極大的恐慌厦酬,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瘫想,死亡現場離奇詭異弃锐,居然都是意外死亡,警方通過查閱死者的電腦和手機殿托,發(fā)現死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門霹菊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人支竹,你說我怎么就攤上這事旋廷。” “怎么了礼搁?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵饶碘,是天一觀的道長。 經常有香客問我馒吴,道長扎运,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任饮戳,我火速辦了婚禮豪治,結果婚禮上,老公的妹妹穿的比我還像新娘扯罐。我一直安慰自己负拟,他們只是感情好,可當我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布歹河。 她就那樣靜靜地躺著掩浙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪秸歧。 梳的紋絲不亂的頭發(fā)上厨姚,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天,我揣著相機與錄音键菱,去河邊找鬼谬墙。 笑死,一個胖子當著我的面吹牛纱耻,可吹牛的內容都是我干的芭梯。 我是一名探鬼主播险耀,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼弄喘,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了甩牺?” 一聲冷哼從身側響起蘑志,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后急但,有當地人在樹林里發(fā)現了一具尸體澎媒,經...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年波桩,在試婚紗的時候發(fā)現自己被綠了戒努。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡镐躲,死狀恐怖储玫,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情萤皂,我是刑警寧澤撒穷,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站裆熙,受9級特大地震影響端礼,放射性物質發(fā)生泄漏。R本人自食惡果不足惜入录,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一蛤奥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧僚稿,春花似錦喻括、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至唤崭,卻和暖如春拷恨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谢肾。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工腕侄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人芦疏。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓冕杠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親酸茴。 傳聞我的和親對象是個殘疾皇子分预,可洞房花燭夜當晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內容