• <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>

            大龍的博客

            常用鏈接

            統計

            最新評論

            Task與Activity詳解 --- 轉

            1. Task是包含一系列Activity的堆棧, 遵循先進后出原則. 

             

            2. Task默認行為: 

             

                (1) 前提: Activity A和Activity B在同一個應用中. 

             

                     操作: Activity A啟動開僻Task堆棧(堆棧狀態: A), 在Activity A中啟動Activity B(堆棧狀態: AB), 按下BACK返回鍵(堆棧狀態: A). 

             

                (2) 前提: Activity A和Activity B在同一個應用中, 應用名稱為"TaskOne應用".

             

                     操作: 在Launcher中單擊"TaskOne應用"圖標, Activity A啟動開僻Task堆棧, 命名為TaskA(TaskA堆棧狀態: A),

                             在Activity A中啟動Activity B(TaskA堆棧狀態: AB), 長按Home鍵, 返回Launcher, 啟動其它應用(如:電子書),

                             開僻一個新Task堆棧, 命名: TaskB, 長按Home健, 返回Launcher, 單擊"TaskOne應用"圖標, 此時TaskA堆棧返回前臺,

                             Activity B為棧頂應用, 供用戶使用. 

             

                (3) 前提: Activity A在名稱為"TaskOne應用"的應用中, Activity C在名稱為"TaskTwo應用"的應用中.

             

                     操作: 在Launcher中單擊"TaskOne應用"圖標, Activity A啟動開僻Task堆棧, 命名為TaskA(TaskA堆棧狀態: A),

                             在Activity A中啟動Activity C(TaskA堆棧狀態: AC),長按Home鍵, 返回Launcher, 啟動"TaskTwo應用"即Activity C,

                             開僻新的Task堆棧, 命名為TaskB, 按BACK鍵返回Launcher, 單擊"TaskOne應用"圖標, 此時TaskA堆棧返回前臺,

                             Activity B為棧頂應用, 供用戶使用. 

             

            3. Intent FLAG介紹:

             

                (1) FLAG_ACTIVITY_NEW_TASK: 

             

                     a. 前提: Activity A和Activity B在同一個應用中. 

             

                         操作: Activity A啟動開僻Task堆棧(堆棧狀態: A), 在Activity A中啟動Activity B, 啟動Activity B的Intent的Flag設為

                                 FLAG_ACTIVITY_NEW_TASK, Activity B被壓入Activity A所在堆棧(堆棧狀態: AB).

             

                         原因: 默認情況下同一個應用中的所有Activity擁有相同的關系(taskAffinity).

             

                     b. 前提: Activity A在名稱為"TaskOne應用"的應用中, Activity C和Activity D在名稱為"TaskTwo應用"的應用中.

             

                         操作1: 在Launcher中單擊"TaskOne應用"圖標, Activity A啟動開僻Task堆棧, 命名為TaskA(TaskA堆棧狀態: A),

                                   在Activity A中啟動Activity C, 啟動Activity C的Intent的Flag設為FLAG_ACTIVITY_NEW_TASK,

                                   Android系統會為Activity C開僻一個新的Task, 命名為TaskB(TaskB堆棧狀態: C), 長按Home鍵, 選擇TaskA,

                                   Activity A回到前臺, 再次啟動Activity C, 這時TaskB回到前臺, Activity C顯示, 供用戶使用, 即:

                                   包含FLAG_ACTIVITY_NEW_TASK的Intent啟動Activity的Task正在運行, 則不會為該Activity創建新的Task,

                                   而是將原有的Task返回到前臺顯示.

             

                         操作2: 在Launcher中單擊"TaskOne應用"圖標, Activity A啟動開僻Task堆棧, 命名為TaskA(TaskA堆棧狀態: A),

                                   在Activity A中啟動Activity C,啟動Activity C的Intent的Flag設為FLAG_ACTIVITY_NEW_TASK,

                                   Android系統會為Activity C開僻一個新的Task, 命名為TaskB(TaskB堆棧狀態: C),  在Activity C中啟動

                                   Activity D(TaskB的狀態: CD) 長按Home鍵, 選擇TaskA, Activity A回到前臺, 再次啟動Activity C,

                                   這時TaskB回到前臺, Activity D顯示,供用戶使用.

             

                (2) FLAG_ACTIVITY_CLEAR_TOP:

             

                     前提: Activity A, Activity B, Activity C和Activity D在同一個應用中.

             

                     操作: Activity A啟動開僻Task堆棧(堆棧狀態: A), 在Activity A中啟動Activity B(堆棧狀態: AB), 在Activity B中啟動

                             Activity C(堆棧狀態: ABC), 在Activity C中啟動Activity D(堆棧狀態: ABCD), 在Activity D中啟動Activity B,

                             啟動Activity B的Intent的Flag設置為FLAG_ACTIVITY_CLEAR_TOP, (堆棧狀態: AB).

             

                (3) FLAG_ACTIVITY_BROUGHT_TO_FRONT:

             

                     前提: Activity A在名稱為"TaskOne應用"的應用中, Activity C和Activity D在名稱為"TaskTwo應用"的應用中.

             

                     操作: 在Launcher中單擊"TaskOne應用"圖標, Activity A啟動開僻Task堆棧, 命名為TaskA(TaskA堆棧狀態: A),

                             在Activity A中啟動Activity C,啟動Activity C的Intent的Flag設為FLAG_ACTIVITY_NEW_TASK,

                             Android系統會為Activity C開僻一個新的Task, 命名為TaskB(TaskB堆棧狀態: C), 在Activity C中啟動

                             Activity D(TaskB的堆棧狀態: CD), 長按Home鍵, 選擇TaskA, Activity A回到前臺, 在Activity A中再次啟動Activity C,

                             在啟動Activity C的Intent中設置Flag為FLAG_ACTIVITY_BROUGHT_TO_FRONT, TaskB回到前臺,

                             Activity C顯示, (TaskB的堆棧狀態: C).

             

                (4) FLAG_ACTIVITY_MULTIPLE_TASK:

             

                     與FLAG_ACTIVITY_NEW_TASK結合使用, 首先在Intent中設置FLAG_ACTIVITY_NEW_TASK, 打開Activity,

                     則啟動一個新Task, 接著在Intent中設置FLAG_ACTIVITY_MULTIPLE_TASK, 再次打開同一個Activity,則還會新啟動一個Task.

             

                (5) FLAG_ACTIVITY_SINGLE_TOP:

             

                     當前Task堆棧中存在ABCD四個Activity, A是棧頂Activity, D為棧底Activity, 存在打開A的Intent中設置了

                     FLAG_ACTIVITY_SINGLE_TOP標志, 則會使用棧頂A, 而不會從新New A.

             

                (6) FLAG_ACTIVITY_RESET_TASK_IF_NEEDED:

             

                     例: 存在Activity A, Activity B, Activity C, Activity A啟動開僻Task堆棧, 命名為TaskA(TaskA堆棧狀態: A),

                          在Activity A中啟動Activity B(TaskA堆棧狀態: AB), 接著Activity B啟動Activity C(TaskA堆棧狀態: ABC),

                          啟動Activity C的Intent中設置FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET標題, 這樣TaskA中有一個還原點,

                          當有包含FLAG_ACTIVITY_RESET_TASK_IF_NEEDED的Intent請求TaskA堆棧時(比如請求Activity A)

                          系統就會將還原點以上的Activity清除, TaskA堆棧中只剩下了AB.

             

            4. launchMode介紹:

             

                (1) standard: 

             

                     如果啟動此Activity的Intent中沒有設置FLAG_ACTIVITY_NEW_TASK標志, 則這個Activity與啟動他的Activity在同一個Task中,

                     如果設置了Activity請參考上面FLAG_ACTIVITY_NEW_TASK的詳細說明,"launchMode"設置為"standard"的

                     Activity可以被實例化多次, 可以在Task中的任何位置, 對于一個新的Intent請求就會實例化一次.

             

               (2) singleTop: 

             

                     如果啟動此Activity的Intent中沒有設置FLAG_ACTIVITY_NEW_TASK標志, 則這個Activity與啟動他的Activity在同一個Task中,

                     如果設置了Activity請參考上面FLAG_ACTIVITY_NEW_TASK的詳細說明,"launchMode"設置為"singleTop"的Activity可以被

                     實例化多次,  可以在Task中的任何位置, 對于一個新的Intent請求如果在Task棧頂, 則會用棧頂的Activity響影Intent請求,

                     而不會重新實例化對象接收請求, 如果沒有在棧頂, 則會實例化一個新的對象接收Intent請求.

             

               (3) singleTask: 

             

                    "launchMode"設置為"singleTask"的Activity總是在棧底, 只能被實例化一次, 它允許其它Activity壓入"singleTask"的Activity

                     所在的Task棧,如果有新的Intent請求有此標志的Activity, 則系統會清除有此標志的Task棧中的全部Activity,并把此Activity顯示出來.

             

               (4) singleInstance: 

             

                     launchMode"設置為"singleInstance"的Activity總是在棧底, 只能被實例化一次, 不允許其它的Activity壓入"singleInstance"

                     的Activity所在Task棧,  即整個Task棧中只能有這么一個Activity.

             

            5. taskAffinity屬性: 

             

               (1) taskAffinity屬性應和FLAG_ACTIVITY_NEW_TASK標志及allowTaskReparenting屬性結合使用, 如果只使用taskAffinity屬性,

                    請參考上面Task默認的行為.

             

               (2) 與FLAG_ACTIVITY_NEW_TASK標志結合:

             

                   a. 前題: Activity A和Activity B在同一個應用中, Activity A與Activity B設置不同的taskAffinity屬性.

             

                       操作: Activity A啟動開僻Task堆棧,命名為TaskA(TaskA堆棧狀態: A), 在Activity A中啟動Activity B, 啟動Activity B

                               的Intent中設置FLAG_ACTIVITY_NEW_TASK標志,這時系統會新開僻一個Task堆棧,TaskB(TaskB堆棧狀態: B).

             

                   b. 前題: Activity A在"TaskOne應用"中, Activity C在"TaskTwo應用"中, Activity A和ActivityC設置了相同的taskAffinity屬性.

             

                       操作: Activity A啟動開僻Task堆棧,命名為TaskA(TaskA堆棧狀態: A), 在Activity A中啟動Activity C, 啟動Activity C的

                               Intent中設置FLAG_ACTIVITY_NEW_TASK標志,這時Activity C會壓入與Activity A堆棧相同的TaskA堆棧(TaskA堆棧狀態: AC).

             

               (3) 與allowTaskReparenting屬性:

             

                     例: 在"TaskOne應用"中有一個天氣預報Activity A, Activity A與"TaskOne應用"中的其它Activity有默認的關系

                          (taskAffinity屬性都沒有設置), 并且allowTaskReparenting屬性設置為true, 現在存在一個"TaskTwo應用

                          "啟動了"TaskOne應用"中的天氣預報Activity A,  這時Activity A與"TaskTwo應用"中的Activity在同一個Task,

                          命名這個Task堆棧為TaskA, 這時"TaskOne應用"啟動, 并且又打開發天氣預報Activity A, 這時Activity A會從TaskA堆棧中轉移到

                          "TaskOne應用"所在的堆棧, 即Activity A可以在多個堆棧中來回轉移.       
               
            6. alwaysRetainTaskState屬性:

             

                如果Task堆棧中的Root Activity設置了此屬性值為true, 不管出現任何情況, 一直會保留Task棧中Activity的狀態.

             

            7. clearTaskOnLaunch屬性:    

                如果Task堆棧中的Root Activity設置了此屬性值為true, 只要你一離開這個Task棧, 則系統會馬上清理除了Root Activity的全部Activity.

             

            8. finishOnTaskLaunch屬性:

             

                如果某Activity設置了finishOnTaskLaunch屬性, 只要你一離開這個Task棧, 則系統會馬上清除這個Activity,

                不管這個Activity在堆棧的任何位置.

            posted on 2013-10-31 20:49 大龍 閱讀(272) 評論(0)  編輯 收藏 引用

            77777亚洲午夜久久多人| 97久久精品人人澡人人爽| 久久久久久噜噜精品免费直播| 亚洲精品无码久久千人斩| 色狠狠久久综合网| 人妻精品久久无码区| 国产产无码乱码精品久久鸭| 国产精品久久久久9999| 国产午夜精品久久久久九九| 久久久久九九精品影院| 久久久久高潮综合影院| 国产一区二区精品久久凹凸| 久久人人超碰精品CAOPOREN| 亚洲精品午夜国产VA久久成人| 久久精品aⅴ无码中文字字幕不卡| 国产精品久久久天天影视| 亚洲精品无码久久久久久| 国产精品免费久久久久久久久 | 人妻丰满?V无码久久不卡| 久久er99热精品一区二区| 久久久久久曰本AV免费免费| 久久艹国产| 美女久久久久久| 久久综合狠狠综合久久97色| 狠狠综合久久综合中文88 | 久久99热这里只有精品国产| 久久精品免费大片国产大片| 日韩欧美亚洲综合久久影院d3| avtt天堂网久久精品| 久久久精品午夜免费不卡| 久久这里只有精品首页| 色婷婷综合久久久久中文字幕| 久久国产视频99电影| 亚洲国产精品无码久久久蜜芽 | WWW婷婷AV久久久影片| 久久偷看各类wc女厕嘘嘘| 97超级碰碰碰久久久久| 国产亚洲精午夜久久久久久| 亚洲欧美精品一区久久中文字幕| 久久精品国产亚洲av麻豆图片| 亚洲色大成网站WWW久久九九|