• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            life02

              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              197 隨筆 :: 3 文章 :: 37 評(píng)論 :: 0 Trackbacks
             http://www.cnblogs.com/kingcent/archive/2011/03/28/1997647.html
            Activity是Android程序的表現(xiàn)層。程序的每一個(gè)顯示屏幕就是一個(gè)Activity。正在運(yùn)行的Activity處在棧的最頂端,它是運(yùn)行狀態(tài)的。

                   當(dāng)有新的Activity進(jìn)入屏幕最上端時(shí),原來的Activity就會(huì)被壓入第二層。如果他的屏幕沒有被完 全遮蓋,那么他處于Paused狀態(tài),如果他被遮蓋那么處于Stop狀態(tài)。

            不管處于任何一層,都可能在系統(tǒng)覺得資源不足時(shí)被強(qiáng)行關(guān)閉,當(dāng)然關(guān)閉時(shí)棧底的程序最先被關(guān)閉。

                   譬如:當(dāng)你在程序中調(diào)用 Activity.finish()方法時(shí),結(jié)果和用戶按下 BACK 鍵一樣:他告訴 Activity Manager該Activity實(shí)例可以被“回收”。隨后 Activity Manager 激活處于棧第二層的 Activity 并重 新入棧,把原 Activity 壓入到棧的第二層,從 Running 狀態(tài)轉(zhuǎn)到 Paused 狀態(tài)。

            1、Task和Activity

            task是能包含很多activity的棧。默認(rèn)情況下,一個(gè)activity啟動(dòng)另外一個(gè)activity時(shí),兩個(gè)activity是放在同一個(gè)task棧中的,第二個(gè)activity壓入第一個(gè) activity所在的task棧。當(dāng)用戶按下返回鍵時(shí),第二個(gè)activity從棧中彈出,第一個(gè)activity又在當(dāng)前屏幕顯示。這樣,從用戶角度來看,這兩個(gè)activity就好像是屬于同一個(gè)應(yīng)用程序的,即使第二個(gè)activity是屬于另外一個(gè)應(yīng)用程序的。當(dāng)然,這是指默認(rèn)情況下。 task棧包含的是activity的對(duì)象。如果一個(gè)activity有多個(gè)實(shí)例在運(yùn)行,那么棧中保存的是每個(gè)實(shí)例的實(shí)體。棧中的activity不會(huì)重新排列,只有彈出和壓入操作。一個(gè)task中的所有activity都以整體的形式移動(dòng)。整個(gè)task可以被移到前臺(tái)或后臺(tái)。打個(gè)比方,當(dāng)前的task包含4個(gè)activity–當(dāng)前 activity下面有3個(gè)activity。當(dāng)用戶按下HOME鍵返回到程序啟動(dòng)器(application launcher)后,選擇了一個(gè)新的應(yīng)用程序(事實(shí)上是一個(gè)新的task),當(dāng)前的task就被轉(zhuǎn)移到后臺(tái),新的task中的根activity將被顯示在屏幕上。過了一段時(shí)間,用戶按返回鍵回到了程序啟動(dòng)器界面,選擇了之前運(yùn)行的程序(之前的task)。那個(gè)task,仍然包含著4個(gè) activity。當(dāng)用戶再次按下返回鍵時(shí),屏幕不會(huì)顯示之前留下的那個(gè)activity(之前的task的根activity),而顯示當(dāng)前 activity從task棧中移出后棧頂?shù)哪莻€(gè)activity。剛剛描述的行為是默認(rèn)的activity和task的行為。有很多方法能夠改變這種行為。activity和task之間的聯(lián)系,以及task中的 activity的行為可以通過intent中的標(biāo)記以及在manifest中的<activity>元素的屬性控制。其中,主要的 Intent標(biāo)記有:

            l FLAG_ACTIVITY_NEW_TASK

            l FLAG_ACTIVITY_CLEAR_TOP

            l FLAG_ACTIVITY_RESET_TASK_IF_NEEDED

            l FLAG_ACTIVITY_SINGLE_TOP

            主要的<activity>屬性有:

            l taskAffinity

            l launchMode

            l allowTaskReparenting

            l clearTaskOnLaunch

            l alwaysRetainTaskState

            l finishOnTaskLaunch

            默認(rèn)情況下,一個(gè)應(yīng)用程序中的所有activity都有一個(gè)affinity–這讓它們屬于同一個(gè)task。然而,每個(gè)activity可以通過<activity>中的taskAffinity屬性設(shè)置單獨(dú)的affinity。不同應(yīng)用程序中的activity可以共享同一個(gè) affinity,同一個(gè)應(yīng)用程序中的不同activity也可以設(shè)置成不同的affinity。affinity屬性在2種情況下起作用:當(dāng)啟動(dòng) activity的Intent對(duì)象包含F(xiàn)LAG_ACTIVITY_NEW_TASK標(biāo)記,或當(dāng)activity的 allowTaskReparenting被設(shè)置成true。

            l FLAG_ACTIVITY_NEW_TASK標(biāo)記

            當(dāng)傳遞給startActivity()的Intent對(duì)象包含F(xiàn)LAG_ACTIVITY_NEW_TASK標(biāo)記時(shí),系統(tǒng)會(huì)為需要啟動(dòng)的activity 尋找與當(dāng)前activity不同的task。如果要啟動(dòng)的activity的affinity屬性與當(dāng)前所有的task的affinity屬性都不相同,系統(tǒng)會(huì)新建一個(gè)帶那個(gè)affinity屬性的task,并將要啟動(dòng)的activity壓到新建的task棧中;否則將activity壓入那個(gè) affinity屬性相同的棧中。

            l allowTaskReparenting屬性

            如果一個(gè)activity的allowTaskReparenting屬性為true,那么它可以從一個(gè)task(TASK1)移到另外一個(gè)有相同affinity的task(TASK2)中(TASK2帶到前臺(tái)時(shí))。

            如果一個(gè).apk文件從用戶角度來看包含了多個(gè)“應(yīng)用程序”,你可能需要對(duì)那些activity賦不同的affinity值。

            2、運(yùn)行模式

            activity的launchMode屬性可以有四種值:

            l “standard” (默認(rèn))

            l “singleTop“

            l “singleTask“

            l “singleInstance“

            這4種模式可以按4種分類來區(qū)分,以下假設(shè)位于task1中的activity1啟動(dòng)activity2:

            模式\分類

            包容activity2的task

            一個(gè)activity是否允許有多個(gè)實(shí)例

            activity是否允許有其它activity共存于一個(gè)task

            對(duì)于新的intent,是否總是實(shí)例化activity對(duì)象

            standard

            如果不包含F(xiàn)LAG_ACTIVITY_NEW_TASK標(biāo)記,則activity2放入task1,否則按前面講述的規(guī)則為activity2選擇task

            可被多次實(shí)例化,同一個(gè)task的不同的實(shí)例可位于不同的task中,每個(gè)task也可包含多個(gè)實(shí)例

            允許

            是的。當(dāng)接收到新的intent時(shí),總是會(huì)生成新的activity對(duì)象。

            singleTop

            同standard

            同standard

            允許

            已存在的activity對(duì)象,如果位于目標(biāo)task的棧頂,則該activity被重用,如果它不位于棧頂,則會(huì)實(shí)例化新的activity對(duì)象

            singleTask

            將activity2放到task1棧底

            不能有多個(gè)實(shí)例。由于該模式下activity總是位于棧頂,所以actvity在同一個(gè)設(shè)備里至多只有一個(gè)實(shí)例

            允許。singleTask模式的activity總是位于棧底位置。目標(biāo)activity實(shí)例已存在時(shí),如果該實(shí)例剛好位于task棧頂,則接收 intent,否則到來的intent將會(huì)被丟棄,但該可以響應(yīng)該intent的那個(gè)activity所在的task將會(huì)被移到前臺(tái)。

             

            singleInstance

            同singleTask

            同singleTask

            不允許與其它activity共存于一個(gè)task。如果activity1的運(yùn)行在該模式下,則activity2一定與activity1位于不同的task

             

            對(duì)于新到的intent,如果是由新創(chuàng)建的activity對(duì)象來接收,則用戶可以通過返回鍵回到之前的activity;如果是由已存在的activity來接收,則用戶無法通過返回鍵返回到接收intent之前的狀態(tài)。

            3、清空棧

            當(dāng)用戶長時(shí)間離開task(當(dāng)前task被轉(zhuǎn)移到后臺(tái))時(shí),系統(tǒng)會(huì)清除task中棧底activity外的所有activity。這樣,當(dāng)用戶返回到task時(shí),只留下那個(gè)task最初始的activity了。

            這是默認(rèn)的情況,<activity>中有些屬性可以改變這種行為。

            l alwaysRetainTaskState屬性

            如果棧底activity的這個(gè)屬性被設(shè)置為true,剛剛描述的情況就不會(huì)發(fā)生。task中的所有activity將被長時(shí)間保存。

            l clearTaskOnLaunch屬性

            如果棧底activity的這個(gè)屬性被設(shè)置為true,一旦用戶離開task,則task棧中的activity將被清空到只剩下棧底activity。這種情況剛好與alwaysRetainTaskState相反。即使用戶只是短暫地離開,task也會(huì)返回到初始狀態(tài)(只剩下棧底acitivty)。

            l finishOnTaskLaunch屬性

            這個(gè)屬性與clearTaskOnLaunch相似,但它只對(duì)單獨(dú)的activity操作,而不是整個(gè)task。它可以結(jié)束任何activity,包括棧底的activity。當(dāng)它設(shè)置為true時(shí),當(dāng)前的activity只在當(dāng)前會(huì)話期間作為task的一部分存在,當(dāng)用戶退出activity再返回時(shí),它將不存在。

            另外還有一種方法能將activity強(qiáng)行從stack中移出。如果intent對(duì)象包含 FLAG_ACTIVITY_CLEAR_TOP標(biāo)記,當(dāng)目標(biāo)task中已存在與接收該intent對(duì)象的activity類型相同的activity實(shí)例存在時(shí),所有位于該activity對(duì)象上面的activity將被清空,這樣接收該intent的activity就位于棧頂,可以響應(yīng)到來的 intent對(duì)象。如果目標(biāo)activity的運(yùn)行模式為standard,則目標(biāo)activtiy也會(huì)被清空。因?yàn)楫?dāng)運(yùn)行模式為standard時(shí),總會(huì)創(chuàng)建新的activity對(duì)象來接收到來的intent對(duì)象。

            FLAG_ACTIVITY_CLEAR_TOP標(biāo)記常常和FLAG_ACTIVITY_NEW_TASK一起使用。用2個(gè)標(biāo)記可以定位已存在的activity并讓它處于可以響應(yīng)intent的位置。

            4、啟動(dòng)任務(wù)(Task)

            Intent filter中有”android.intent.action.MAIN” action和”android.intent.category.LAUNCHER” category的activity將被標(biāo)記為task的入口。帶有這兩個(gè)標(biāo)記的activity將會(huì)顯示在應(yīng)用程序啟動(dòng)器(application launcher)中。

            第二個(gè)比較重要的點(diǎn)是,用戶必須能夠離開task并在之后返回。因?yàn)檫@個(gè)原因,singleTask和 singleInstance這兩種運(yùn)行模式只能應(yīng)用于含有MAIN和LAUNCHER過濾器的activity。打個(gè)比方,如果不包含帶MAIN和 LAUNCHER過濾器,某個(gè)activity運(yùn)行了一個(gè)singleTask模式的activity,初始化了一個(gè)新的task,當(dāng)用戶按下HOME鍵時(shí),那個(gè)activity就被主屏幕“擋住”了,用戶再也無法返回到那個(gè)activity。

            類似的情況在 FLAG_ACTIVITY_NEW_TASK標(biāo)記上也會(huì)出現(xiàn)。如果這個(gè)標(biāo)記會(huì)新建一個(gè)task,當(dāng)用戶按下HOME鍵時(shí),必須有一種方式能夠讓用戶返回到那個(gè)activity。有些東西(比如notification manager)總是要求在外部task中啟動(dòng)activity,在傳遞給startActivity的intent中總是包含 FLAG_ACTIVITY_NEW_TASK標(biāo)記。

            對(duì)于那種不希望用戶離開之后再返回activity的情況,可將finishOnTaskLaunch屬性設(shè)置為true。


            實(shí)戰(zhàn)篇:

                場景1:我們需要一個(gè)activity一直存活,且狀態(tài)一直保留我們可以讓該activity獨(dú)占一格task棧,如下設(shè)置activity屬性。

                 android:launchMode="singleInstance" android:taskAffinity="com.test"

                 把launchMode和taskAffinity結(jié)合起來用會(huì)有異想不到的效果。

                場景2:我們需要一個(gè)activity  ——“A” 存活于task棧并且一旦返回A,那么A之上的所有activity都會(huì)被銷毀。如下設(shè)置activity屬性。

                 android:launchMode="singleTask"  android:clearTaskOnLaunch="true"


            分類: Android
            posted on 2012-02-21 16:19 life02 閱讀(556) 評(píng)論(0)  編輯 收藏 引用

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            久久99久久99精品免视看动漫| 国产农村妇女毛片精品久久| 久久人人添人人爽添人人片牛牛| 精品久久久久久无码不卡| 久久精品国产清自在天天线| 久久国产免费直播| 久久精品无码午夜福利理论片| 精品国产婷婷久久久| 99蜜桃臀久久久欧美精品网站 | 无码国内精品久久人妻蜜桃| 久久99国产精品尤物| 亚洲精品无码专区久久同性男| 久久精品国产亚洲AV无码麻豆| 久久亚洲中文字幕精品一区四| 91精品国产色综合久久| 久久婷婷是五月综合色狠狠| 国产精品欧美久久久久无广告| 亚洲国产精品无码久久SM| 色综合久久中文字幕综合网| 久久精品国产99国产电影网| 99精品久久精品一区二区| 久久国产香蕉一区精品| 中文字幕成人精品久久不卡| 久久久久亚洲AV片无码下载蜜桃| 久久这里有精品| 一本色道久久综合| 亚洲国产精品成人久久蜜臀| 国产一区二区三精品久久久无广告 | 伊人久久大香线蕉亚洲五月天| 久久亚洲欧洲国产综合| 久久久久这里只有精品| 久久性精品| 日本亚洲色大成网站WWW久久| 精品久久久久久久久久中文字幕 | 97视频久久久| 2020国产成人久久精品 | 精品久久久久久无码专区| 日本久久久久亚洲中字幕| 亚洲精品国精品久久99热一| 亚洲综合日韩久久成人AV| 伊人久久大香线蕉AV色婷婷色|