?定義Activity????activity指與用戶交互的界面
?定義類繼承Activity
?在AndroidManifest.xml的節(jié)點(diǎn)中聲明
?顯式意圖創(chuàng)建方式
?構(gòu)造函數(shù),代碼少
new?Intent(this, NewActivity.class);
?類名形式,靈活,可擴(kuò)展性強(qiáng)
intent.setClassName(this, "cn.itcast.activity.NewActivity");
?包名類名形式,可啟動其他程序中的Activity
intent.setClassName("cn.itcast.downloader", "cn.itcast.downloader.MainActivity");
?創(chuàng)建Activity并傳遞數(shù)據(jù)
?在Intent對象中封裝了一個Bundle對象,可以用來攜帶數(shù)據(jù)
?在新Activity中可以獲得意圖對象以獲取其中Bundle保存的數(shù)據(jù)
?創(chuàng)建Activity獲取返回數(shù)據(jù)
?使用startActivityForResult(Intent intent, int?requestCode)方法打開Activity
?重寫onActivityResult(int?requestCode, int?resultCode, Intent data)方法
?新Activity中調(diào)用setResult(int?resultCode, Intent data)設(shè)置返回數(shù)據(jù)之后,關(guān)閉Activity就會調(diào)用onActivityResult方法
?隱式意圖創(chuàng)建Activity
?顯式意圖是指在創(chuàng)建意圖時指定了組件,而隱式意圖則不指定組件,通過動作、類型、數(shù)據(jù)匹配對應(yīng)的組件
?在清單文件中定義時需要定義才能被隱式意圖啟動
?中至少配置一個和一個,否則無法被啟動
?Intent對象中設(shè)置的action、category、data在必須全部包含才能啟動
?<intent-filter>中的、、都可以配置多個,Intent對象中不用全部匹配,每樣匹配一個即可啟動
?如果一個意圖可以匹配多個Activity,Android系統(tǒng)會提示選擇
Acitivity三種狀態(tài)
運(yùn)行:activity在最前端運(yùn)行
停止:activity不可見,完全被覆蓋
暫停:activity可見,但前端還有其他activity
生命周期相關(guān)方法
onCreate:創(chuàng)建時調(diào)用,或者程序在暫停、停止?fàn)顟B(tài)下被殺死之后重新打開時也會調(diào)用[當(dāng)這個界面第一次創(chuàng)建的時候執(zhí)行這個方法,當(dāng)然
? 一般情況下,在一個應(yīng)用中這個方法只會執(zhí)行一次,(橫豎屏切換)]
onStart:onCreate之后或者從停止?fàn)顟B(tài)恢復(fù)時調(diào)用
onResume:onStart之后或者從暫停狀態(tài)恢復(fù)時調(diào)用,從停止?fàn)顟B(tài)恢復(fù)時由于調(diào)用onStart,也會調(diào)用onResume(當(dāng)一個界面可以和用戶交互,獲取到焦點(diǎn)的的時候,執(zhí)行這個方法,什么是和用戶交互?? ?比如說,你點(diǎn)擊屏幕上的按鈕,圖片等等,activity會給出不同的反應(yīng))
onPause:進(jìn)入暫停、停止?fàn)顟B(tài),或者銷毀時會調(diào)用(onPause()方法和onResume()方法對應(yīng),即activity不能和用戶交互的,activity失去焦點(diǎn),界面上的view
? 不能被點(diǎn)擊的時候執(zhí)行。)
onStop:進(jìn)入停止?fàn)顟B(tài),或者銷毀時會調(diào)用(當(dāng)activity不可見的時候,執(zhí)行這個方法,如從一個activity跳轉(zhuǎn)到另一個activity時,跳轉(zhuǎn)
? 前的activity被跳轉(zhuǎn)后的activity遮擋,就會執(zhí)行onStop()這個方法)
onDestroy:銷毀時調(diào)用 (當(dāng)一個activity銷毀的時候調(diào)用這個方法,與onCreate()對應(yīng))
onRestart:從停止?fàn)顟B(tài)恢復(fù)時調(diào)用 (從第一個activity跳轉(zhuǎn)到第二個activity,再返回第一個 activity時,就會執(zhí)行這個方法
? 界面重新變得可見就會執(zhí)行這個方法。)
這些方法都是兩兩對應(yīng)的,onCreate創(chuàng)建與onDestroy銷毀;onStart可見與onStop不可見; onResume可編輯(即獲得焦點(diǎn))與onPause(失去焦點(diǎn))。

保存信息相關(guān)方法
onSaveInstanceState:在Activity被動的摧毀或停止的時候調(diào)用,用于保存運(yùn)行數(shù)據(jù),可以將數(shù)據(jù)存在在Bundle中
onRestoreInstanceState:該方法在Activity被重新創(chuàng)建的時候調(diào)用,例如改變屏幕方向,savedInstanceState為onSaveInstanceState保存的數(shù)據(jù)
?啟動模式
在AndroidManifest.xml中的標(biāo)簽中可以配置android:launchMode屬性,用來控制Actvity的啟動模式?
四種啟動模式都需要在清單文件下的Activity節(jié)點(diǎn)下配置,如果不配置,則默認(rèn)標(biāo)準(zhǔn)standard開啟activity
?在Android系統(tǒng)中我們創(chuàng)建的Acitivity是以棧的形式呈現(xiàn)的
standard:每次調(diào)用startActivity()啟動時都會創(chuàng)建一個新的Activity放在棧頂
singleTop:啟動Activity時,指定Activity不在棧頂就創(chuàng)建,如在棧頂,則不再創(chuàng)建
singleTask:如果啟動的Activity不存在就創(chuàng)建,如果存在直接跳轉(zhuǎn)到指定的Activity所在位置
在Activity啟動模式為singleTask(唯一實例)的情況下,當(dāng)啟動Activity的時候,如果當(dāng)前Activity不存在則實例化一個新的Activity,如果當(dāng)前Activity在任務(wù)棧中已經(jīng)存在,則會復(fù)用這個Activity實例。當(dāng)啟動模式為singTask的時候,啟動已經(jīng)存在在Activity任務(wù)棧中但不在棧頂?shù)腁ctivity時,該Activity會把壓在它前面的所有Activity彈出任務(wù)棧
singleInstance:如果啟動的Activity不存在就創(chuàng)建,如果存在就將指定的Activity移動到棧頂
在Activity啟動模式為singleInstance的情況下,首先我們可以發(fā)現(xiàn)的是啟動模式為singleInstance的Activity處于不同的任務(wù)棧(Task編號不同),并保證不再有其他的Activity實例進(jìn)入,它還是和singleTask一樣保持唯一實例,然后它的退出順序是不再是根據(jù)調(diào)用順序,而是在不同的任務(wù)棧中,從上往下退出。
1、在standard(默認(rèn))啟動模式下,我們來回的去跳轉(zhuǎn)Activity,看下日志打印,發(fā)現(xiàn)是不會調(diào)用onNewIntent方法的,因為它不是一個實例。
2、在singleTop模式下,我們從第一個Activity跳轉(zhuǎn)到第二個Activity,再從第二個Activity跳轉(zhuǎn)自身,再跳轉(zhuǎn)第一個Activity,看下日志打印,我們可以發(fā)現(xiàn),當(dāng)?shù)诙€Activity置于棧頂?shù)臅r候,由于重用了實例,所以調(diào)用了onNewIntent方法。
3.當(dāng)singleTask和singleInstance模式下也是一樣的,因為重用了實例,所以會調(diào)用onNewIntent方法,且onNewIntent方法是在前一個Activity的onStop方法后(當(dāng)前ActivityonReStart方法前)立即調(diào)用的。
1、Activity任務(wù)棧
在Android的官方文檔描述中我們可以知道,任務(wù)棧也是棧,具有棧的一切特點(diǎn)。
Activity任務(wù)棧,顧名思義是存放Activity任務(wù)的棧,這里的任務(wù)棧為上圖箱子,Activity為上圖的東西。
當(dāng)我們每打開一個Activity的時候它會就往Activity任務(wù)棧中壓入一個Activity,當(dāng)我們每銷毀一個Activity的時候它會從Activity任務(wù)棧中彈出一個Activity,由于安卓系統(tǒng)自身的設(shè)計,我們只能在手機(jī)屏幕上獲取當(dāng)前一個Activity的焦點(diǎn)即棧頂元素(最上面的Activity),其余的Activity會暫居后臺等待系統(tǒng)調(diào)用。

1.1、關(guān)于任務(wù)棧的概念:
任務(wù)棧是用來提升體驗而設(shè)計的:
(1) 程序打開時就創(chuàng)建了一個任務(wù)棧, 用于存儲當(dāng)前程序的activity,當(dāng)前程序(包括被當(dāng)前程序所調(diào)用的)所有的activity屬于一個任務(wù)棧。
(2) 一個任務(wù)棧包含了一個activity的集合, 可以有序的選擇哪一個activity和用戶進(jìn)行交互,只有在任務(wù)棧棧頂?shù)腶ctivity才可以跟用戶進(jìn)行交互。
(3) 任務(wù)棧可以移動到后臺,并且保留了每一個activity的狀態(tài). 并且有序的給用戶列出它們的任務(wù), 而且還不丟失它們狀態(tài)信息。
(4) 退出應(yīng)用程序時,當(dāng)把所有的任務(wù)棧中所有的activity清除出棧時,任務(wù)棧會被銷毀,程序退出。
1.2、關(guān)于任務(wù)棧的缺點(diǎn):
(1) 每開啟一次頁面都會在任務(wù)棧中添加一個Activity,而只有任務(wù)棧中的Activity全部清除出棧時,任務(wù)棧被銷毀,程序才會退出,這樣就造成了用戶體驗差,需要點(diǎn)擊多次返回才可以把程序退出了。
(2) 每開啟一次頁面都會在任務(wù)棧中添加一個Activity還會造成數(shù)據(jù)冗余重復(fù)數(shù)據(jù)太多,會導(dǎo)致內(nèi)存溢出的問題(OOM)。
2、Activity的4種啟動方式
為了解決任務(wù)棧產(chǎn)生的問題,Android為Activity設(shè)計了啟動模式,那么下面的內(nèi)容將介紹Android中Activity的啟動模式,這也是最重要的內(nèi)容之一。
啟動模式(launchMode)在多個Activity跳轉(zhuǎn)的過程中扮演著重要的角色,它可以解決是否生成新的Activity實例,是否重用已經(jīng)存在的Activity實例,是否和其他實例共用一個任務(wù)棧。任務(wù)棧是一個具有棧結(jié)構(gòu)的對象,一個任務(wù)??梢怨芾矶鄠€Activity,每啟動一個應(yīng)用,也就創(chuàng)建一個與之對應(yīng)的任務(wù)棧。
Activity一共有以下四種launchMode模式:1、standard 2、singTop 3、singTask 4、singleInstance,我們可以在AndroidManifest.xml配置的android:launchMode屬性為以上四種之一即可。
內(nèi)存管理
Android系統(tǒng)在運(yùn)行多個進(jìn)程時,如果系統(tǒng)資源不足,會強(qiáng)制結(jié)束一些進(jìn)程。優(yōu)先選擇哪個進(jìn)程來結(jié)束是有優(yōu)先級的。
空:進(jìn)程中沒有任何組件
后臺:進(jìn)程中只有停止?fàn)顟B(tài)的Activity
服務(wù):進(jìn)程中有正在運(yùn)行的服務(wù)
可見:進(jìn)程中有一個暫停狀態(tài)的Activity
前臺:進(jìn)程中正在運(yùn)行一個Activity