Activity是Android組件中最基本也是最為常見用的四大組件(Activity矮烹,Service图焰,Content Provider盐碱,BroadcastReceiver)之一;
本篇主要從以下幾點(diǎn)來詳解Activity
*Activity的生命周期
*Activity的啟動模式
一榛了、Activity的生命周期
可以看到Activity有7個(gè)最基本的生命周期方法
1.onCreate:Activity即將被創(chuàng)建矿咕;
2.onStart:表示Activity正在被啟動抢肛,已經(jīng)可見了,但是還沒有顯示到前臺碳柱;
3.onRestart:Activity正在重新啟動捡絮,當(dāng)Activity從不可見到可見時(shí)會調(diào)用此方法;
4.onResume:Activity可見莲镣,并且已經(jīng)顯示到前臺可以和用戶交互了福稳;(onStart的時(shí)候Activity還在后臺,在onResume后Activity才顯示到前臺)
5.onPause:Activity正在停止(可見但不在前臺)瑞侮;
6.onStop:Activity即將停止(不可見亦不在前臺)的圆;
7.onDestroy:Activity即將銷毀鼓拧;
接下來我們從幾個(gè)實(shí)例中來具體了解一下Activity的生命周期;
首先:我們正常啟動一個(gè)Activity
然后我們回到桌面:
我們再次打開這個(gè)Activity
在這個(gè)Activity上再啟動一個(gè)Dialog形式的Activity越妈,第一個(gè)Activity任然可見季俩,但是已經(jīng)轉(zhuǎn)入后臺
然后我們退出Dialog返回第一個(gè)Activity
從第一個(gè)Activity跳轉(zhuǎn)到另一個(gè)Activity(非Dialog形式)
再推出第二個(gè)Activity返回第一個(gè)
最后我們退出第一個(gè)Activity
這里有幾點(diǎn)需要注意:
1、onCreate和onDestroy梅掠、onStart和onStop酌住、onResume和onPause是配對的,其中
onPause和onResume與onStart和onStop的區(qū)別在于前者是以是否在前臺顯示來判斷的后者是以是否可以見來區(qū)分的阎抒;
2酪我、從一個(gè)Activity啟動另一個(gè)Activity,第一個(gè)Activity會首先onPause且叁,緊接著第二個(gè)Activity開始o(jì)nCreate祭示、onStart、onResume后谴古,第一個(gè)Activity執(zhí)行onStop;一定要注意跳轉(zhuǎn)時(shí)候Activity的生命周期方法執(zhí)行順序稠歉;
特別說明:如果在一個(gè)Activity上啟動了一個(gè)Dialog(非Activity形式)掰担,這時(shí)候Activity雖然可見,但是不在前臺怒炸,Activity是不會執(zhí)行onPause方法的带饱;
下面我們來研究一下異常情況下Activity的生命周期,所謂異常情況就是資源相關(guān)的系統(tǒng)配置發(fā)生改變導(dǎo)致Activity被殺死并重建或者資源內(nèi)存不足導(dǎo)致優(yōu)先級低的Activity被系統(tǒng)回收等等阅羹;最常見的就是橫豎屏切換勺疼,Activity狀態(tài)會發(fā)生那些改變呢;
首先我們正常啟動一個(gè)Activity:
正常的走了生命周期的方法幔荒;
然后我們從豎屏切換到橫屏:
這里我們可以看到待逞,Activity銷毀了并重新創(chuàng)建榴啸,Activity在銷毀之前調(diào)用了onSaveInstanceState,并且在Activity重新創(chuàng)建成功后調(diào)用了onRestoreInstanceState方法轨淌;
onSaveInstanceState:Activity異常銷毀保存Activity數(shù)據(jù)和狀態(tài);
onRestoreInstanceState:Activity異常銷毀重新創(chuàng)建后恢復(fù)數(shù)據(jù)看尼;
注意:以上方法只會在Activity異常銷毀的時(shí)候調(diào)用递鹉,正常情況下是不會調(diào)用的;
另外還有一種特殊情況藏斩,我們在某些狀態(tài)改變導(dǎo)致Activity銷毀重建如果不希望Activity重新創(chuàng)建躏结,例如橫豎屏切換不希望Activity重新創(chuàng)建需要在清單文件中Activity中配置 android:configChanges="orientation" (需要minSdkVersion和targetSdkVersion的值都小于13否則需要配置android:configChanges="orientation|screenSize")
我們來看一下效果,添加以上配置后狰域,我們將Activity從豎屏切換到橫屏
可以看到Activity并沒有重建媳拴,而是調(diào)用了onConfigurationChanged方法黄橘;
通過上面的分析,我們已經(jīng)了解了Activity的生命周期禀挫,以及Activity在特殊情況下的生命周期旬陡;掌握了Activity的生命周期,就可以在不同的方法中做相應(yīng)的處理语婴,對以后的開發(fā)很有幫助描孟;
二、Activity的啟動模式
①standard:標(biāo)準(zhǔn)模式砰左,系統(tǒng)默認(rèn)模式匿醒,最常用;
②singleTop:棧頂復(fù)用模式缠导,如果Activity位于任務(wù)棧內(nèi)棧頂位置Activity不會重新創(chuàng)建廉羔;
③singleTask:棧內(nèi)復(fù)用模式,只要Activity在棧內(nèi)存在僻造,多次啟動Activity就不會重新創(chuàng)建憋他;
④singleInstance:單實(shí)例模式;這種模式下髓削,Activity只能單純的存在一個(gè)任務(wù)棧中竹挡;
注意:任務(wù)棧是一種“后進(jìn)先出”棧結(jié)構(gòu),每一個(gè)Activity都必須依賴一個(gè)任務(wù)棧立膛,這也是為什么我們用ApplicationContext去啟動Activity的時(shí)候會報(bào)錯(cuò)的原因揪罕;standard模式下的Activity默認(rèn)會進(jìn)入啟動它的Activity的任務(wù)棧中;非Activity類型的Context(ApplicationContext)并沒有所謂的任務(wù)棧宝泵,所以就出問題了好啰,解決這個(gè)問題就需要為待啟動的Activity指定 FLAG_ACTIVITY_NEW_TASK 標(biāo)記位,這樣就會在啟動的時(shí)候?yàn)槠鋭?chuàng)建一個(gè)新的標(biāo)記位儿奶;
啟動模式解讀:
1框往、standard標(biāo)準(zhǔn)模式:每啟動一次Activity,都會為這個(gè)Activity創(chuàng)建實(shí)例闯捎;
2搅窿、singleTop模式:假如在一個(gè)任務(wù)棧中有ABC三個(gè)Activity(都是singleTop啟動模式),如果再次啟動C隙券,由于C在棧頂男应,那么C就不會被重新創(chuàng)建同時(shí)它的onNewIntent方法會被回調(diào);如果啟動A娱仔,由于A不在棧頂沐飘,A就會被重新創(chuàng)建;
3、singleTask模式:假如一個(gè)任務(wù)棧中有ABC三個(gè)Activity耐朴,(A為singleTask模式)借卧,A并不在棧頂,我們重新啟動A筛峭,A也并不會創(chuàng)建新的铐刘,而是直接移到棧頂并調(diào)用A的onNewIntent方法;此時(shí)棧內(nèi)的Activity為 A 影晓,因?yàn)閟ingleTask模式自帶clearTop的效果镰吵,會導(dǎo)致所有在A上面的Activity自動出棧;
4挂签、singleInstance模式:這個(gè)是加強(qiáng)版的singleTask模式疤祭,它具有singleTask的所有特性;并且還加強(qiáng)了一點(diǎn)饵婆,這種模式下的Activity只能單獨(dú)的位于一個(gè)任務(wù)棧中勺馆,加入A為這種啟動模式,啟動A后侨核,A單獨(dú)位于一個(gè)任務(wù)棧中草穆,這個(gè)任務(wù)棧中只能有一個(gè)Activity A;
注意:由于Activity啟動必須依賴任務(wù)棧搓译,任務(wù)棧是可以指定的悲柱,可以在清單文件中配置android:taskAffinity=“”熟悉,任務(wù)棧的名字為String侥衬,如果不指定,進(jìn)入默認(rèn)的任務(wù)棧跑芳,即以包名為名的任務(wù)棧轴总;
如何給Activity指定啟動模式
第一種方式:直接在AndroidMenifest中指定 android:launchMode
第二種方式:通過Intent中設(shè)置標(biāo)志位來為Activity指定
Intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
兩種方式的區(qū)別:第二種優(yōu)先級大于第一種,如果兩種方式都用了博个,以第二種方式執(zhí)行怀樟;第二種方式無法為Activity指定為singleInstance模式;
Activity中的標(biāo)志位:
1盆佣、FLAG_ACTIVITY_NEW_TASE:為Activity指定singleTask啟動模式
2往堡、FLAG_ACTIVITY_SINGLE_TOP:singleTop模式
3、FLAG_ACTIVITY_CLEAR_TOP:當(dāng)這個(gè)Activity啟動時(shí)所用位于它之上的Activity全部出棧共耍;
4虑灰、FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:具有這個(gè)標(biāo)記的Activity,不會出現(xiàn)在歷史Activity列表中痹兜;某種情況下穆咐,我們不希望用戶通過歷史列表回到我們的Activity時(shí)這個(gè)標(biāo)記比較有用;等同于在XML中指定Activity的屬性
android:excludeFromRecents="true"
小結(jié):本次的Activity詳解一共就這些內(nèi)容主要點(diǎn)為
1、Activity的生命周期对湃,Activity從啟動到銷毀崖叫,從前臺到后臺,不同情況下Activity的哪些生命周期方法會被調(diào)用拍柒;以及Activity在異常銷毀后重新創(chuàng)建要調(diào)用的方法心傀;
2、Activity的啟動模式拆讯;不同的場景應(yīng)用不同的啟動模式脂男,各個(gè)啟動模式間的區(qū)別;了解這些對以后的開發(fā)很有幫助往果;