?Activity:是Android的四大組件之一,主要處理界面的顯示相關(guān)。
Activity的生命周期:
onCreat():在Activity創(chuàng)建的時(shí)候執(zhí)行,接受參數(shù)Bundle savedInstanceState,一般用于初始化數(shù)據(jù)。(savedInstanceState參數(shù)說(shuō)明:主要用于當(dāng)Activity被異常殺死的時(shí)候狱从,用于保存數(shù)據(jù));
onStart():在Activity由不可見(jiàn)變?yōu)榭梢?jiàn)的時(shí)候調(diào)用叠纹,一般不進(jìn)行任何操作季研;
onResume():Activity變成可見(jiàn),獲得焦點(diǎn)與用戶進(jìn)行交流誉察,前臺(tái)狀態(tài)训貌。
onPause():Activity可見(jiàn),但是沒(méi)有獲得焦點(diǎn)冒窍,屬于暫停狀態(tài)递沪,不處于棧頂當(dāng)時(shí)可以看見(jiàn)界面;
onStop():Activity變成完全不可間的時(shí)候調(diào)用综液,進(jìn)入后臺(tái)狀態(tài)款慨;一般可以釋放一些消耗資源的程序;
onDestory ():Activity被銷毀的時(shí)候調(diào)用谬莹;
圖中具有三個(gè)向上的流程進(jìn)行一一說(shuō)明:
第一條 ?onStop()——onRestart()——onStart();
當(dāng)Aacitvity沒(méi)有被回收檩奠,不可見(jiàn),或則說(shuō)沒(méi)有處于棧頂時(shí)附帽,被再次啟動(dòng)的時(shí)候就會(huì)執(zhí)行第一條流程埠戳。
第二條 onPause()——onResume()
Activity由失去焦點(diǎn)狀態(tài)進(jìn)入獲得焦點(diǎn)狀態(tài)(AlderDialog消失的時(shí)候會(huì)進(jìn)行第二條流程)
第三條 onStop()——onCreat();
Activity當(dāng)處于后的時(shí)候,被系統(tǒng)意外回收時(shí)會(huì)進(jìn)行第三條流程蕉扮;
在系統(tǒng)回收之前會(huì)調(diào)用onSaveInstanceState();保存示例狀態(tài)整胃;在onCreat()時(shí)候調(diào)用onRestartInstanceState(BundlesavedInstanceState)
onSaveInstanceState()執(zhí)行時(shí)機(jī):調(diào)用遵循一個(gè)重要原則,即當(dāng)系統(tǒng)“未經(jīng)你許可”時(shí)銷毀了你的activity喳钟,則onSaveInstanceState會(huì)被系統(tǒng)調(diào)用屁使,這是系統(tǒng)的責(zé)任在岂,因?yàn)樗仨氁峁┮粋€(gè)機(jī)會(huì)讓你保存你的數(shù)據(jù)(當(dāng)然你不保存那就隨便你了)。
如何銷毀一個(gè)Acitvity蛮寂?
直接調(diào)用finish()方法,進(jìn)行銷毀蔽午。
會(huì)執(zhí)行的生命周期:onPause(),onStop(),onDestory().
BaseActivity的說(shuō)明:一般在開(kāi)發(fā)中,所有的Activity都不會(huì)直接繼承自Activity酬蹋,而是繼承自BaseActivity及老,而B(niǎo)aseActivity繼承自Activity;可以在BaseActivity中寫(xiě)一些接口范抓,動(dòng)態(tài)權(quán)限的添加写半,沉浸狀態(tài)欄等;
Activity的啟動(dòng)模式:詳細(xì)見(jiàn)網(wǎng)址:http://blog.csdn.net/guolin_blog/article/details/41087993
首先是啟動(dòng)模式的設(shè)置:可以manifest清單文件中通過(guò)launchModel來(lái)設(shè)置尉咕,也可以通過(guò)Intent ? ? ? 中添加flag來(lái)完成啟動(dòng)模式的設(shè)置。當(dāng)兩種模式都設(shè)置了啟動(dòng)模式限制璃岳,Intent的更優(yōu)先(廣播機(jī)制中也是動(dòng)態(tài)注冊(cè)廣播優(yōu)先于靜態(tài)注冊(cè)的廣播)年缎;
? ? ? ? 在具體說(shuō)明啟動(dòng)模式的時(shí)候,先說(shuō)以下铃慷,系統(tǒng)管理Activity的管理基本過(guò)程单芜,系統(tǒng)通過(guò)返回站的模式管理,是一種先進(jìn)后出的模式犁柜。
在manifest文件中進(jìn)行模式設(shè)置:
standard:默認(rèn)啟動(dòng)模式
當(dāng)我們沒(méi)有在清單文件中設(shè)置Activity的啟動(dòng)模式的時(shí)候洲鸠,我們采用的就是這種啟動(dòng)模式;
這總模式是指馋缅,當(dāng)我們啟動(dòng)設(shè)置這個(gè)模式的Activity扒腕,就會(huì)新建一個(gè)Activity實(shí)例,并切放置在棧頂萤悴。
singleTop:棧頂唯一
當(dāng)我們啟動(dòng)Activity的時(shí)候首先會(huì)進(jìn)行判斷瘾腰,該activity是否位于站定,如果位于站定覆履,則不創(chuàng)建新的Acitvity蹋盆,如果不位于棧頂,則創(chuàng)建新的實(shí)例硝全,并放入到棧頂栖雾;
singleTask:任務(wù)唯一
啟動(dòng)自身Activity的情況:當(dāng)啟動(dòng)自身Activity的時(shí)候,就會(huì)先判斷任務(wù)棧是否具有當(dāng)前Activity伟众,如果沒(méi)有新創(chuàng)建析藕,并至于棧頂。如果具有該Activity凳厢,就會(huì)將該Activity之前所有的Activity出棧噪径,將改Activity至于棧頂柱恤。
啟動(dòng)其他應(yīng)用的Activity:當(dāng)啟動(dòng)他應(yīng)用設(shè)置singleTask的Activity的時(shí)候,就會(huì)新啟動(dòng)一個(gè)任務(wù)找爱,并將其放到棧頂梗顺;
singleInstance:?jiǎn)螌?shí)例
啟動(dòng)的Activity會(huì)新建一個(gè)任務(wù),并且這個(gè)任務(wù)中只有這一個(gè)Activity车摄,當(dāng)這個(gè)Activity啟動(dòng)其他Activity的時(shí)候會(huì)放在其他任務(wù)中寺谤。
Intent的啟動(dòng)模式說(shuō)明:?吮播?
Activity的沉浸模式:http://blog.csdn.net/guolin_blog/article/details/51763825
幾種功能:首先隱藏或則透明狀態(tài)欄变屁,隱藏或則透明導(dǎo)航欄,真正的沉浸式模式意狠。
Intent:在Activty粟关,Service,Broadcast之間都有使用环戈。
Intent在Activity之間的使用:分為顯示Intent與隱式Intent兩種闷板;
首先說(shuō)的顯示Intent的使用方法:
Intent ?intent=new Intent(MainActivity.this,SecondClass.class);
//參數(shù)說(shuō)明:第一個(gè)參數(shù)為上下問(wèn)對(duì)象(context),當(dāng)然也可以是其子類院塞;
//第二個(gè)參數(shù)為想要啟動(dòng)的目標(biāo)活動(dòng)
startActivity(intent);
//啟動(dòng)相應(yīng)意圖遮晚,完成跳轉(zhuǎn)
隱式意圖:隱式意圖比顯示意圖含蓄的多;
不明確指出我們要啟動(dòng)哪一個(gè)活動(dòng)拦止,而是指定了一系列更為抽象的action與category等信息县遣,然后交給系統(tǒng)去分析,并啟動(dòng)相應(yīng)的activity汹族;
基本行動(dòng)原理解析:當(dāng)在新建Intent的時(shí)候會(huì)指定action與category萧求;action在每個(gè)Intent中只能有一個(gè),而category可以又多個(gè)(當(dāng)寫(xiě)的時(shí)候?yàn)槟J(rèn)android.intent.category.DEFAULT);在AndroidManifest中activty中添加<intent-filter>標(biāo)簽顶瞒,在intent-filter中添加action與category饭聚;只又intent中的action與category同時(shí)與intent-filter中的action與category匹配的時(shí)候,這個(gè)活動(dòng)就會(huì)相應(yīng)搁拙;
代碼示例:
//發(fā)送隱士意圖
Intent intent=new Intent("com.this.action");
//采用構(gòu)造方法添加action
intent.addCategory("com.this.category");
//通過(guò)addCategory添加category秒梳,如果不添加也會(huì)又默認(rèn)的category;
startActivity(intent);
//接受隱式意圖的Activity
需要在AndroidManifest中添加intent-filter
<activty ?android :name=".SecondActivity">
<intent-filter>
<action android:name="com.this.action"/>
<category android:name="com.this.category"/>
</intent-filter>
</activity>
隱式意圖的其他使用方法:可以用于開(kāi)啟其他應(yīng)用的activity箕速。
(當(dāng)我們用系統(tǒng)的瀏覽器酪碘,或則打電話,或則分享到微信盐茎,都是啟動(dòng)其他應(yīng)用的activity)
舉例說(shuō)明:?jiǎn)?dòng)系統(tǒng)瀏覽器
Intent ? intent=new ?Intent("Intent.ACTION_VIEW")兴垦;
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
關(guān)于setData()方法說(shuō)明:
在intent-filter標(biāo)簽中有個(gè)類似與category的標(biāo)簽<data>,
<data>用于指定當(dāng)前活動(dòng)能夠響應(yīng)什么數(shù)據(jù)。
<data>配置具體內(nèi)容:
android.scheme-用于指定數(shù)據(jù)的協(xié)議部分,例如http協(xié)議探越;
android.host--用于指定數(shù)據(jù)的主機(jī)部分狡赐,如上例中的wwwbaidu.com.
android.port--用于指定端口號(hào);
android.path--用于指定端口好后的部分
android.mineType--指定可以處理的數(shù)據(jù)類型钦幔;
只有<data>標(biāo)簽中指定的內(nèi)容和Intent中攜帶的Data完全一致時(shí)枕屉,當(dāng)前活動(dòng)才能夠相應(yīng)該Intent。(不過(guò)一般Intent不會(huì)指定過(guò)多內(nèi)容鲤氢,瀏覽器只指定了協(xié)議)
代碼示例:
Intent? intent=new? Intent("Intent.ACTION_VIEW")搀擂;
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
<intent-filter>
<action android:name="android.intent.action.View"/>
<category android:name="android.intent.category.DEFAULT">
<data android: scheme="http">
</intent-filter>
只有action category data ?同時(shí)匹配時(shí)候,才會(huì)啟動(dòng)相應(yīng)的activity卷玉;
向下一個(gè)活動(dòng)傳遞數(shù)據(jù):Intent不但可以啟動(dòng)其他活動(dòng)哨颂,也可以向下一個(gè)活動(dòng)傳遞數(shù)據(jù),也可以將數(shù)據(jù)返回到上一個(gè)相种。
intent提供了一系列的putExtra()方法的重載威恼,可以把我們要傳遞的數(shù)據(jù)存在Intent中,啟動(dòng)另一活動(dòng)的時(shí)候寝并,只需要把這些數(shù)據(jù)再?gòu)腎ntent中取出來(lái)箫措。
代碼示例:
發(fā)送示例:
String data="Hello SecondActivity";
Intent ?intent=new Intent(FirstActivity.this,SecondActivity.class);
//通過(guò)鍵值對(duì)的方式進(jìn)行數(shù)據(jù)存儲(chǔ),前方是鍵食茎,用于取出數(shù)據(jù)的時(shí)候使用,后面的參數(shù)為具體數(shù)值馏谨;
intent.putExtra("extra_data",data);
startActivity(intent);
接受示例:
Intent intent=getIntent();
String data=intent.getStringExtra("extra_data");
返回參數(shù)給上一個(gè)活動(dòng):
啟動(dòng)Activity中
startActivityForResult()方法接受兩個(gè)參數(shù)别渔,第一個(gè)參數(shù)還是Intent,第二個(gè)參數(shù)是請(qǐng)求碼惧互,用于相應(yīng)后判斷數(shù)據(jù)來(lái)源哎媚。
Intent? intent=new Intent(MainActivity.this,SecondClass.class);
startActivityForResult(intent,1);
在被啟動(dòng)的activity中,需要寫(xiě)入setResult(),該方法具有兩個(gè)參數(shù):第一個(gè)參數(shù)用于想上一個(gè)活動(dòng)返回處理結(jié)果喊儡,一般只使用RESULT_OK或則RESULT_CANCELED這兩個(gè)值拨与,第二個(gè)參數(shù)為Intent-只用于傳遞數(shù)據(jù);
Intent? intent=new Intent();
intent.putEXtra("data","back_1");
setReuslt(RESULT_OK,intent);
finish();
啟動(dòng)Activity中
從寫(xiě)onActivityReuslt(),一共接受3個(gè)參數(shù)艾猜,第一個(gè)參數(shù)為requestCode請(qǐng)求碼买喧,在startActivityForResult();中的第二個(gè)參數(shù),第二個(gè)resultCOde匆赃,即我們setResult()中返回?cái)?shù)據(jù)結(jié)果淤毛。第三個(gè)為setResult()的第二個(gè)參數(shù),也是返回的數(shù)據(jù)結(jié)果載體算柳;
一般在onActivityReuslt()中通過(guò)requestCode判斷是哪個(gè)Activity返回的數(shù)據(jù)低淡,然后通過(guò)resultCode判斷值的來(lái)源判斷處理結(jié)果是否成功,進(jìn)行相應(yīng)處理;