Activity學(xué)習(xí)

簡介:

Activity是一個(gè)應(yīng)用組件月褥,用戶可與其提供的屏幕進(jìn)行交互等浊,以執(zhí)行撥打電話、拍攝照片抄谐、發(fā)送電子郵件等操作渺鹦。每個(gè)Activity都會獲得一個(gè)用于繪制其用戶界面的窗口。窗口通常會充滿屏幕蛹含,但也可小于屏幕并浮動子其他窗口之上毅厚。

一個(gè)應(yīng)用通常由多個(gè)彼此松散聯(lián)系的Activity組成。一般會指定應(yīng)用中的某個(gè)Activity為“主”Activity浦箱,即應(yīng)用首次啟動時(shí)呈現(xiàn)給用戶的那個(gè)Activity吸耿。而且每個(gè)Activity均可啟動另外的Activity祠锣,以便執(zhí)行不同的操作。每次新的Activity啟動時(shí)咽安,前一Activity便會停止伴网,但系統(tǒng)會在堆棧(“返回棧”)中保留該Activity板乙。當(dāng)新的Activity啟動時(shí)是偷,系統(tǒng)會將其推送到返回棧中,并獲得用戶焦點(diǎn)募逞。返回棧,遵循“后進(jìn)先出”的機(jī)制馋评,因此當(dāng)用戶完成當(dāng)前Activity并按下返回按鈕時(shí)放接,系統(tǒng)會從堆棧中將其彈出(并銷毀),恢復(fù)前一Activity留特。

當(dāng)一個(gè)Activity因某一個(gè)新的Activity啟動而停止時(shí)纠脾,系統(tǒng)通過該Activity的聲明周期回調(diào)方法通知其這一狀態(tài)變化。Activity因狀態(tài)變化-系統(tǒng)是創(chuàng)建Activity蜕青、停止Activity苟蹈、恢復(fù)Activity還是銷毀Activity-收到的回調(diào)方法可能有若干種,每一種回調(diào)方法都會為你提供執(zhí)行與該狀態(tài)變化相應(yīng)的特定操作的機(jī)會右核。


創(chuàng)建 Activity

要?jiǎng)?chuàng)建 Activity慧脱,您必須創(chuàng)建Activity的子類(或使用其現(xiàn)有子類)。您需要在子類中實(shí)現(xiàn) Activity 在其生命周期的各種狀態(tài)之間轉(zhuǎn)變時(shí)(例如創(chuàng)建 Activity贺喝、停止 Activity菱鸥、恢復(fù) Activity 或銷毀 Activity 時(shí))系統(tǒng)調(diào)用的回調(diào)方法。 兩個(gè)最重要的回調(diào)方法是:

onCreate()

您必須實(shí)現(xiàn)此方法躏鱼。系統(tǒng)會在創(chuàng)建您的 Activity 時(shí)調(diào)用此方法氮采。您應(yīng)該在實(shí)現(xiàn)內(nèi)初始化 Activity 的必需組件。 最重要的是染苛,您必須在此方法內(nèi)調(diào)用setContentView()鹊漠,以定義 Activity 用戶界面的布局。

onPause()

系統(tǒng)將此方法作為用戶離開 Activity 的第一個(gè)信號(但并不總是意味著 Activity 會被銷毀)進(jìn)行調(diào)用茶行。 您通常應(yīng)該在此方法內(nèi)確認(rèn)在當(dāng)前用戶會話結(jié)束后仍然有效的任何更改(因?yàn)橛脩艨赡懿粫祷兀?/p>

您還應(yīng)使用幾種其他生命周期回調(diào)方法躯概,以便提供流暢的 Activity 間用戶體驗(yàn),以及處理導(dǎo)致您的 Activity 停止甚至被銷毀的意外中斷拢军。 后文的管理 Activity 生命周期部分對所有生命周期回調(diào)方法進(jìn)行了闡述楞陷。

實(shí)現(xiàn)用戶界面

Activity 的用戶界面是由層級式視圖—衍生自View類的對象—提供的。每個(gè)視圖都控制 Activity 窗口內(nèi)的特定矩形空間茉唉,可對用戶交互作出響應(yīng)固蛾。 例如结执,視圖可以是在用戶觸摸時(shí)啟動某項(xiàng)操作的按鈕。

您可以利用 Android 提供的許多現(xiàn)成視圖設(shè)計(jì)和組織您的布局艾凯∠揍#“小工具”是提供按鈕、文本字段趾诗、復(fù)選框或僅僅是一幅圖像等屏幕視覺(交互式)元素的視圖蜡感。 “布局”是衍生自ViewGroup的視圖,為其子視圖提供唯一布局模型恃泪,例如線性布局郑兴、網(wǎng)格布局或相對布局。您還可以為View類和ViewGroup類創(chuàng)建子類(或使用其現(xiàn)有子類)來自行創(chuàng)建小工具和布局贝乎,然后將它們應(yīng)用于您的 Activity 布局情连。

利用視圖定義布局的最常見方法是借助保存在您的應(yīng)用資源內(nèi)的 XML 布局文件。這樣一來览效,您就可以將用戶界面的設(shè)計(jì)與定義 Activity 行為的源代碼分開維護(hù)却舀。 您可以通過setContentView()將布局設(shè)置為 Activity 的 UI,從而傳遞布局的資源 ID锤灿。不過挽拔,您也可以在 Activity 代碼中創(chuàng)建新View,并通過將新View插入ViewGroup來創(chuàng)建視圖層次但校,然后通過將根ViewGroup傳遞到setContentView()來使用該布局螃诅。

如需了解有關(guān)創(chuàng)建用戶界面的信息,請參閱用戶界面文檔始腾。

在清單文件中聲明 Activity

您必須在清單文件中聲明您的 Activity州刽,這樣系統(tǒng)才能訪問它。 要聲明您的 Activity浪箭,請打開您的清單文件穗椅,并將<activity>元素添加為<application>元素的子項(xiàng)。例如:

...

...

您還可以在此元素中加入幾個(gè)其他特性奶栖,以定義 Activity 標(biāo)簽匹表、Activity 圖標(biāo)或風(fēng)格主題等用于設(shè)置 Activity UI 風(fēng)格的屬性。android:name特性是唯一的必需特性—它指定 Activity 的類名宣鄙。應(yīng)用一旦發(fā)布袍镀,即不應(yīng)更改此類名,否則冻晤,可能會破壞諸如應(yīng)用快捷方式等一些功能(請閱讀博客文章Things That Cannot Change[不能更改的內(nèi)容])苇羡。

在清單文件中聲明 Activity

您必須在清單文件中聲明您的 Activity,這樣系統(tǒng)才能訪問它鼻弧。 要聲明您的 Activity设江,請打開您的清單文件锦茁,并將<activity>元素添加為<application>元素的子項(xiàng)。例如:

...

...

使用 Intent 過濾器

<activity>元素還可指定各種 Intent 過濾器—使用<Intent-filter>元素—以聲明其他應(yīng)用組件激活它的方法叉存。

當(dāng)您使用 Android SDK 工具創(chuàng)建新應(yīng)用時(shí)码俩,系統(tǒng)自動為您創(chuàng)建的存根 Activity 包含一個(gè) Intent 過濾器,其中聲明了該 Activity 響應(yīng)“主”操作且應(yīng)置于“l(fā)auncher”類別內(nèi)歼捏。 Intent 過濾器的內(nèi)容與以下所示類似:

<action>元素指定這是應(yīng)用的“主”入口點(diǎn)稿存。<category>元素指定此 Activity 應(yīng)列入系統(tǒng)的應(yīng)用啟動器內(nèi)(以便用戶啟動該 Activity)。

如果您打算讓應(yīng)用成為獨(dú)立應(yīng)用瞳秽,不允許其他應(yīng)用激活其 Activity瓣履,則您不需要任何其他 Intent 過濾器。 正如前例所示寂诱,只應(yīng)有一個(gè) Activity 具有“主”操作和“l(fā)auncher”類別拂苹。 您不想提供給其他應(yīng)用的 Activity 不應(yīng)有任何 Intent 過濾器,您可以利用顯式 Intent 自行啟動它們

啟動 Activity

您可以通過調(diào)用startActivity()痰洒,并將其傳遞給描述您想啟動的 Activity 的Intent來啟動另一個(gè) Activity。Intent 對象會指定您想啟動的具體 Activity 或描述您想執(zhí)行的操作類型(系統(tǒng)會為您選擇合適的 Activity浴韭,甚至是來自其他應(yīng)用的 Activity)丘喻。 Intent 對象還可能攜帶少量供所啟動 Activity 使用的數(shù)據(jù)。

在您的自有應(yīng)用內(nèi)工作時(shí)念颈,您經(jīng)常只需要啟動某個(gè)已知 Activity泉粉。 您可以通過使用類名創(chuàng)建一個(gè)顯式定義您想啟動的 Activity 的 Intent 對象來實(shí)現(xiàn)此目的。 例如榴芳,可以通過以下代碼讓一個(gè) Activity 啟動另一個(gè)名為SignInActivity的 Activity:

Intentintent=newIntent(this,SignInActivity.class);

startActivity(intent);

不過嗡靡,您的應(yīng)用可能還需要利用您的 Activity 數(shù)據(jù)執(zhí)行某項(xiàng)操作,例如發(fā)送電子郵件窟感、短信或狀態(tài)更新讨彼。 在這種情況下,您的應(yīng)用自身可能不具有執(zhí)行此類操作所需的 Activity柿祈,因此您可以改為利用設(shè)備上其他應(yīng)用提供的 Activity 為您執(zhí)行這些操作哈误。 這便是 Intent 對象的真正價(jià)值所在—您可以創(chuàng)建一個(gè) Intent 對象,對您想執(zhí)行的操作進(jìn)行描述躏嚎,系統(tǒng)會從其他應(yīng)用啟動相應(yīng)的 Activity蜜自。 如果有多個(gè) Activity 可以處理 Intent,則用戶可以選擇要使用哪一個(gè)卢佣。 例如重荠,如果您想允許用戶發(fā)送電子郵件,可以創(chuàng)建以下 Intent 對象:

Intentintent=newIntent(Intent.ACTION_SEND);

intent.putExtra(Intent.EXTRA_EMAIL,recipientArray);

startActivity(intent);

添加到 Intent 中的EXTRA_EMAILextra 是一個(gè)字符串?dāng)?shù)組虚茶,其中包含應(yīng)將電子郵件發(fā)送到的電子郵件地址戈鲁。 當(dāng)電子郵件應(yīng)用響應(yīng)此 Intent 時(shí)仇参,它會讀取 extra 中提供的字符串?dāng)?shù)組,并將它們放入電子郵件撰寫窗體的“收件人”字段荞彼。 在這種情況下冈敛,電子郵件應(yīng)用的 Activity 啟動,并且當(dāng)用戶完成操作時(shí)鸣皂,您的 Activity 會恢復(fù)執(zhí)行抓谴。

結(jié)束 Activity

您可以通過調(diào)用 Activity 的finish()方法來結(jié)束該 Activity。您還可以通過調(diào)用finishActivity()結(jié)束您之前啟動的另一個(gè) Activity寞缝。

注:在大多數(shù)情況下癌压,您不應(yīng)使用這些方法顯式結(jié)束 Activity。 正如下文有關(guān) Activity 生命周期的部分所述荆陆,Android 系統(tǒng)會為您管理 Activity 的生命周期滩届,因此您無需完成自己的 Activity。 調(diào)用這些方法可能對預(yù)期的用戶體驗(yàn)產(chǎn)生不良影響被啼,因此只應(yīng)在您確實(shí)不想讓用戶返回此 Activity 實(shí)例時(shí)使用帜消。

管理 Activity 生命周期

通過實(shí)現(xiàn)回調(diào)方法管理 Activity 的生命周期對開發(fā)強(qiáng)大而又靈活的應(yīng)用至關(guān)重要。 Activity 的生命周期會直接受到 Activity 與其他 Activity浓体、其任務(wù)及返回棧的關(guān)聯(lián)性的影響泡挺。

Activity 基本上以三種狀態(tài)存在:

已繼續(xù)

此 Activity 位于屏幕前臺并具有用戶焦點(diǎn)。(有時(shí)也將此狀態(tài)稱作“運(yùn)行中”命浴。)

已暫停

另一個(gè) Activity 位于屏幕前臺并具有用戶焦點(diǎn)娄猫,但此 Activity 仍可見。也就是說生闲,另一個(gè) Activity 顯示在此 Activity 上方媳溺,并且該 Activity 部分透明或未覆蓋整個(gè)屏幕。 已暫停的 Activity 處于完全 Activity 狀態(tài)(Activity對象保留在內(nèi)存中碍讯,它保留了所有狀態(tài)和成員信息悬蔽,并與窗口管理器保持連接),但在內(nèi)存極度不足的情況下冲茸,可能會被系統(tǒng)終止屯阀。

已停止

該 Activity 被另一個(gè) Activity 完全遮蓋(該 Activity 目前位于“后臺”)。 已停止的 Activity 同樣仍處于 Activity 狀態(tài)(Activity對象保留在內(nèi)存中轴术,它保留了所有狀態(tài)和成員信息难衰,但與窗口管理器連接)。 不過逗栽,它對用戶不再可見盖袭,在他處需要內(nèi)存時(shí)可能會被系統(tǒng)終止。

如果 Activity 處于暫停或停止?fàn)顟B(tài)鳄虱,系統(tǒng)可通過要求其結(jié)束(調(diào)用其finish()方法)或直接終止其進(jìn)程弟塞,將其從內(nèi)存中刪除。(將其結(jié)束或終止后)再次打開 Activity 時(shí)拙已,必須重建决记。


圖 1 說明了這些循環(huán)以及 Activity 在狀態(tài)轉(zhuǎn)變期間可能經(jīng)過的路徑。矩形表示回調(diào)方法倍踪,當(dāng) Activity 在不同狀態(tài)之間轉(zhuǎn)變時(shí)系宫,您可以實(shí)現(xiàn)這些方法來執(zhí)行操作。

pic1


保存 Activity 狀態(tài)

管理 Activity 生命周期的引言部分簡要提及建车,當(dāng) Activity 暫屠┙瑁或停止時(shí),Activity 的狀態(tài)會得到保留缤至。 確實(shí)如此潮罪,因?yàn)楫?dāng) Activity 暫停或停止時(shí)领斥,Activity對象仍保留在內(nèi)存中 — 有關(guān)其成員和當(dāng)前狀態(tài)的所有信息仍處于 Activity 狀態(tài)嫉到。 因此,用戶在 Activity 內(nèi)所做的任何更改都會得到保留月洛,這樣一來屯碴,當(dāng) Activity 返回前臺(當(dāng)它“繼續(xù)”)時(shí),這些更改仍然存在膊存。

不過,當(dāng)系統(tǒng)為了恢復(fù)內(nèi)存而銷毀某項(xiàng) Activity 時(shí)忱叭,Activity對象也會被銷毀隔崎,因此系統(tǒng)在繼續(xù) Activity 時(shí)根本無法讓其狀態(tài)保持完好,而是必須在用戶返回Activity時(shí)重建Activity對象韵丑。但用戶并不知道系統(tǒng)銷毀 Activity 后又對其進(jìn)行了重建爵卒,因此他們很可能認(rèn)為 Activity 狀態(tài)毫無變化。 在這種情況下撵彻,您可以實(shí)現(xiàn)另一個(gè)回調(diào)方法對有關(guān) Activity 狀態(tài)的信息進(jìn)行保存钓株,以確保有關(guān) Activity 狀態(tài)的重要信息得到保留:onSaveInstanceState()

系統(tǒng)會先調(diào)用onSaveInstanceState()陌僵,然后再使 Activity 變得易于銷毀轴合。系統(tǒng)會向該方法傳遞一個(gè)Bundle,您可以在其中使用putString()putInt()等方法以名稱-值對形式保存有關(guān) Activity 狀態(tài)的信息碗短。然后受葛,如果系統(tǒng)終止您的應(yīng)用進(jìn)程,并且用戶返回您的 Activity,則系統(tǒng)會重建該 Activity总滩,并將Bundle同時(shí)傳遞給onCreate()onRestoreInstanceState()纲堵。您可以使用上述任一方法從Bundle提取您保存的狀態(tài)并恢復(fù)該 Activity 狀態(tài)。如果沒有狀態(tài)信息需要恢復(fù)闰渔,則傳遞給您的Bundle是空值(如果是首次創(chuàng)建該 Activity席函,就會出現(xiàn)這種情況)。

pic2

圖 2.在兩種情況下冈涧,Activity 重獲用戶焦點(diǎn)時(shí)可保持狀態(tài)完好:系統(tǒng)在銷毀 Activity 后重建 Activity茂附,Activity 必須恢復(fù)之前保存的狀態(tài);系統(tǒng)停止 Activity 后繼續(xù)執(zhí)行 Activity炕舵,并且 Activity 狀態(tài)保持完好何之。

注:無法保證系統(tǒng)會在銷毀您的 Activity 前調(diào)用onSaveInstanceState(),因?yàn)榇嬖诓恍枰4鏍顟B(tài)的情況(例如用戶使用“返回”按鈕離開您的 Activity 時(shí)咽筋,因?yàn)橛脩舻男袨槭窃陲@式關(guān)閉 Activity)溶推。 如果系統(tǒng)調(diào)用onSaveInstanceState(),它會在調(diào)用onStop()之前奸攻,并且可能會在調(diào)用onPause()之前進(jìn)行調(diào)用蒜危。

不過,即使您什么都不做睹耐,也不實(shí)現(xiàn)onSaveInstanceState()辐赞,Activity類的onSaveInstanceState()默認(rèn)實(shí)現(xiàn)也會恢復(fù)部分 Activity 狀態(tài)。具體地講硝训,默認(rèn)實(shí)現(xiàn)會為布局中的每個(gè)View調(diào)用相應(yīng)的onSaveInstanceState()方法响委,讓每個(gè)視圖都能提供有關(guān)自身的應(yīng)保存信息。Android 框架中幾乎每個(gè)小工具都會根據(jù)需要實(shí)現(xiàn)此方法窖梁,以便在重建 Activity 時(shí)自動保存和恢復(fù)對 UI 所做的任何可見更改赘风。例如,EditText小工具保存用戶輸入的任何文本纵刘,CheckBox小工具保存復(fù)選框的選中或未選中狀態(tài)邀窃。您只需為想要保存其狀態(tài)的每個(gè)小工具提供一個(gè)唯一的 ID(通過android:id屬性)。如果小工具沒有 ID假哎,則系統(tǒng)無法保存其狀態(tài)瞬捕。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市舵抹,隨后出現(xiàn)的幾起案子肪虎,更是在濱河造成了極大的恐慌,老刑警劉巖掏父,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件笋轨,死亡現(xiàn)場離奇詭異秆剪,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)爵政,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進(jìn)店門仅讽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人钾挟,你說我怎么就攤上這事洁灵。” “怎么了掺出?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵徽千,是天一觀的道長。 經(jīng)常有香客問我汤锨,道長双抽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任闲礼,我火速辦了婚禮牍汹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘柬泽。我一直安慰自己慎菲,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布锨并。 她就那樣靜靜地躺著露该,像睡著了一般。 火紅的嫁衣襯著肌膚如雪第煮。 梳的紋絲不亂的頭發(fā)上解幼,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天,我揣著相機(jī)與錄音包警,去河邊找鬼书幕。 笑死,一個(gè)胖子當(dāng)著我的面吹牛揽趾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播苛骨,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼篱瞎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了痒芝?” 一聲冷哼從身側(cè)響起俐筋,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎严衬,沒想到半個(gè)月后澄者,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年粱挡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了赠幕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,861評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡询筏,死狀恐怖榕堰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情嫌套,我是刑警寧澤逆屡,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站踱讨,受9級特大地震影響魏蔗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜痹筛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一莺治、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧味混,春花似錦产雹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至馆衔,卻和暖如春瘟判,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背角溃。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工拷获, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人减细。 一個(gè)月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓匆瓜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親未蝌。 傳聞我的和親對象是個(gè)殘疾皇子驮吱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評論 2 361

推薦閱讀更多精彩內(nèi)容