Android基礎(chǔ)知識——Activity

?定義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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容