1. 程式人生 > >android深入解析Activity的launchMode啟動模式,Intent Flag,taskAffinity

android深入解析Activity的launchMode啟動模式,Intent Flag,taskAffinity

  最近看到一篇文章講launchMode,想到以前的一次面試,就問了這一個問題,最基本的大家都知道,但是詳細的我就迷糊了,最終失敗了,所以在此總結一下,希望能夠幫助一下大家

  launchMode分為四種:
  

standard

  standard啟動模式為最基本的啟動模式,預設為該種啟動模式,特點就是每當傳送一個intent請求開啟該activity時,都會建立一個新的activity例項。實際使用情況分為兩種,一種是本應用開啟,一種是跨應用開啟:  

  • 本應用開啟,新建立的activity例項放入本應用,即傳送intent的task棧的頂部,這個比較簡單
  • 跨引用開啟,這裡有一個需要注意的地方是跨應用開啟的時候會在 Recent app 頁面顯示兩個獨立項,但是此時它們兩個 Activity 仍然是在一個棧中,非常感謝@夢想編制楠灬 的指正,跨應用開啟在 Standard 模式下也是在一個棧中,雖然在 Recent app 頁面是兩個頁面:
    這裡寫圖片描述

    但是問題來了,又一次我偶然發現使用瀏覽器開啟手機上的bilibili則是在同一個 Recent App 項中:
    這裡寫圖片描述
    使用命令adb shell dumpsys activity獲取手機的的activity棧的詳細資訊
Running activities (most recent first):
      TaskRecord{9312e08 #811 A=com.htc.task.browser U=0 sz=2}
        Run #1: ActivityRecord{1409e01a u0 tv.danmaku.bili/.ui.video.VideoDetailsActivity t811}
Run #0: ActivityRecord{64f3f7c u0 com.htc.sense.browser/.BrowserActivity t811}

如上圖所示,com.htc.sense.browser/.BrowserActivity和tv.danmaku.bili/.ui.video.VideoDetailsActivity在同一個 recent app 頁面中,這是怎麼回事了,最後我發現有一個intent的flag變數有該作用:FLAG_ACTIVITY_RESET_TASK_IF_NEEDED,只要將該flag設定進intent中就會將跨應用的activity開啟在同一個 Recent app 中,感興趣的可以試一下。

singleTop

  
  singleTop其實和standard幾乎一樣,和standard算一組,使用singleTop的Activity也可以建立很多個例項。唯一不同的就是,如果呼叫的目標Activity已經位於呼叫者的Task的棧頂,則不建立新例項,而是使用當前的這個Activity例項,並呼叫這個例項的onNewIntent方法。
  這個使用場景比較少,可以使用的例子比如使用者已經在當前activity,使用者點選一條推送訊息之後也需要跳轉到當前activity,那麼為了避免activity的重複開啟,則需要將該activity設定為singleTop並且複寫onNewIntent即可。
  如果是外部程式啟動singleTop的Activity,表現都和standard一樣。

singleTask

  使用singleTask啟動模式的Activity 在系統中 只會存在一個例項。如果這個例項已經存在,intent就會通過onNewIntent傳遞到這個Activity,並且將棧中該activity之上的activity清除(銷燬過程會呼叫Activity生命週期回撥),如果不存在新的Activity例項將被建立。
  這裡寫圖片描述

 實際使用情況也分為兩組:

  • 本應用啟動,在一個應用中啟動設定為singleTask的activity,如果該activity在task棧中不存在,則會建立一個新的例項放在棧頂,如果在activity的task棧中已經存在了該activity例項,則會將棧中該activity例項之上的其他activity例項清空,並且會呼叫該activity的onNewIntent方法。最常用的使用例子就是首頁,比如首頁上面已經有了很多的activity,回到首頁就可以使用這種方式,然後複寫首頁的onNewIntent方法。使用提示:onNewIntent方法中不能進行fragment的相關操作 http://blog.sina.com.cn/s/blog_5da93c8f0101rgb2.html

  • 跨應用啟動,由於整個系統只能存在activity的一個例項,所以如果系統中不存在該activity,則會啟動一個新的task去啟動該activity,並且將該activity放入棧底。如果系統中存在該activity例項,則會直接啟動該activity,呼叫該activity的onNewIntent的方法,同時將該activity task棧上面的其他activity清空(銷燬過程會呼叫Activity生命週期回撥),此時如果使用者摁下返回鍵,那麼將在singleTask activity的task棧中操作,即返回該棧中singleTask activity的上一個activity直到該棧中無activity時才會返回到最開始啟動singleTask activity的activity中。還有一種情況是singleTask Activity所在的應用程序存在,但是singleTask Activity例項不存在,那麼從別的應用啟動這個Activity,新的Activity例項會被建立,並放入到所屬程序所在的Task中,並位於棧頂位置。

注意如果使用了singleTask,FLAG_ACTIVITY_RESET_TASK_IF_NEEDED這個flag將會失效。
  需要特別注意的是:
  1.在4.x和之前的系統下,A1(startActivityForResult)->A2(singleTask, startActivityForResult)->A3->A4,當A1開啟A2之後會立即回撥onActivityResult()函式,A2開啟A3仍然可以正常回調onActivityResult();但是從5.0開始,A1開啟A2的時候 onActivityResult() 函式也能正常的回撥,不會立即回撥。
  2.在4.x和之前的系統下,A1(startActivityForResult)->A2(singleTask, startActivityForResult)->A3,生命週期的流程是

A1.onStart()->A1.onResume()(startActivityForResult開啟A2)->A1.onPause()
->A1.onActvitiyResult->A1.onResume()->A1.onPause()->A2.onStart()
->A2.onResume()->A1.onStop()(startActivityForResult開啟A3)->A2.onPause()
->A3.onStart()->A3.onResume()->A2.onStop()

(注:onCreate和onDestroy這兩個生命週期沒有變化,所以沒有加進去,還有一個是A1.onStop生命週期在A2.onResume之後這個是不一定的,視情況而定),上面的變化必須要是startActivityForResult()+5.0之前的系統才會出現,可以推測是由於onActivityResult()函式引起的這個問題。

singleInstance

  和singleTask類似,在系統中 只會存在一個例項,唯一的區別就是系統不會在singleInstance activity的task棧中啟動任何其他的activity,singleInstance activity棧中僅僅只能有該activity的例項,其他任何從這個activity啟動的activity都會在其他的棧中被開啟。
  雖然使用adb shell dumpsys activity可以看到singleInstance activity在一個獨立的task中,但是在工作管理員中,還是顯示的一個
  這裡寫圖片描述
  需要特別注意的是:
  1.A1->A2(SingleInstance),摁下 Home 鍵之後,點選應用圖示再次進入應用,返回的是 A1 頁面,這是因為 A2 在另一個單獨的 Activity task 棧中,點選圖示返回的是主 Activity 棧,所以此時顯示的 A1 頁面,而不是 A2 頁面。
  2.注意singleInstance的返回鍵的處理和上面3個 mode 有區別,如果是使用正常的 startActivity 進行的啟動,啟動順序A1->A2->A3(singleInstance)->A4,在A4頁面摁下back鍵,返回的是A2,再返回A1,接著再次摁下back鍵,返回的才是A3;如果是使用 startActivityForResult 啟動的,在4.x和之前的系統下,表現和之前是一樣的,但是在5.0開始,A1->A2-A3(singleInstance + startActivityForResult)->A4,在A4摁下返回鍵,返回的是A3->A2->A1,這個需要著重說明一下。
  3.另一個比較重要的是,在4.x和之前的系統下,A1(startActivityForResult)->A2(singleInstance, startActivityForResult)->A3->A4,當A1開啟A2之後會立即回撥onActivityResult()函式,A2開啟A3也會立即回撥onActivityResult()函式;但是從5.0開始,A1開啟A2和A2開啟A3的兩種情況下 onActivityResult() 函式都能正常的回撥,不會立即回撥。
  4.還有一個比較重要的是,在4.x和之前的系統下,A1(startActivityForResult)->A2(singleInstance, startActivityForResult)->A3,生命週期的流程是

A1.onStart()->A1.onResume()(startActivityForResult開啟A2)->A1.onPause()
->A1.onActvitiyResult->A1.onResume()->A1.onPause()->A2.onStart()
->A2.onResume()->A1.onStop()(startActivityForResult開啟A3)->A2.onPause()
->A2.onActivityResult()->A2.onResume()->A2.onPause()->A3.onStart()
->A3.onResume()->A2.onStop()

和singleTask一樣,也是必須要是startActivityForResult()+5.0之前的系統才會出現,區別就只是A2開啟A3的情況不同。

  Intent的flag有很多,介紹一下吧

FLAG_ACTIVITY_BROUGHT_TO_FRONT
  比方說我現在有A,在A中啟動B,在A中Intent中加上這個標記。此時B就是以FLAG_ACTIVITY_BROUGHT_TO_FRONT 這個啟動的,在B中再啟動C,D(正常啟動C,D),如果這個時候在D中再啟動B,這個時候最後的棧的情況是 A,C,D,B.。
FLAG_ACTIVITY_CLEAR_TASK
  如果在呼叫startActivity時傳遞這個標記,該task棧中的其他activity會先被清空,然後該activity在該task中啟動,也就是說,這個新啟動的activity變為了這個空task的根activity。所有老的activity都結束掉。該標誌必須和FLAG_ACTIVITY_NEW_TASK一起使用。
FLAG_ACTIVITY_CLEAR_TOP
  如果該activity已經在task中存在,並且設定了該task,系統不會啟動新的 Activity 例項,會將task棧裡該Activity之上的所有Activity一律結束掉,然後將Intent發給這個已存在的Activity。Activity收到 Intent之後,或者在onNewIntent()裡做下一步的處理,或者自行結束然後重新建立自己。如果 Activity 在 AndroidMainifest.xml 裡將啟動模式設定成預設standard模式,並且 Intent 裡也沒有設定 FLAG_ACTIVITY_SINGLE_TOP,那麼他將會結束並且重啟;否則則會傳遞到onNewIntent方法,FLAG_ACTIVITY_CLEAR_TOP 還可以和 FLAG_ACTIVITY_NEW_TASK 配合使用,用來啟動一個task棧的根activity,他將會把該棧清空為根狀態,比如從notification manager啟動activity。
FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET
  已經廢棄,請使用FLAG_ACTIVITY_NEW_DOCUMENT
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
  設定完之後,新的activity將不會新增到當前activity列表中,當某些情況下我們不希望使用者通過歷史列表回到我們的Activity的時候這個標記比較有用。他等同於在XML中指定Activity的屬性android:excludeFromRecents=”true”。
FLAG_ACTIVITY_FORWARD_RESULT
  如果設定,並且這個Intent用於從一個存在的Activity啟動一個新的Activity,那麼,這個作為答覆目標的Activity將會傳到這個新的Activity中。這種方式下,新的Activity可以呼叫setResult(int),並且這個結果值將傳送給那個作為答覆目標的Activity。
FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
  一般由系統呼叫,比如長摁home鍵從歷史記錄中啟動。
FLAG_ACTIVITY_MULTIPLE_TASK
  這個標識用來建立一個新的task棧,並且在裡面啟動新的activity(所有情況,不管系統中存在不存在該activity例項),經常和FLAG_ACTIVITY_NEW_DOCUMENT或者FLAG_ACTIVITY_NEW_TASK一起使用。這上面兩種使用場景下,如果沒有帶上FLAG_ACTIVITY_MULTIPLE_TASK標識,他們都會使系統搜尋存在的task棧,去尋找匹配intent的一個activity,如果沒有找到就會去新建一個task棧;但是當和FLAG_ACTIVITY_MULTIPLE_TASK一起使用的時候,這兩種場景都會跳過搜尋這步操作無條件的建立一個新的task。和FLAG_ACTIVITY_NEW_TASK一起使用需要注意,儘量不要使用該組合除非你完成了自己的頂部應用啟動器,他們的組合使用會禁用已經存在的task棧回到前臺的功能。
FLAG_ACTIVITY_NEW_DOCUMENT
  api 21之後加入的一個標識,用來在intent啟動的activity的task棧中開啟一個document,和documentLaunchMode效果相等,有著不同的documents的activity的多個例項,將會出現在最近的task列表中。單獨使用效果和documentLaunchMode=”intoExisting”一樣,如果和FLAG_ACTIVITY_MULTIPLE_TASK一起使用效果就等同於documentLaunchMode=”always”。
FLAG_ACTIVITY_NEW_TASK
  設定此狀態,記住以下原則,首先會查詢是否存在和被啟動的Activity具有相同的親和性的任務棧(即taskAffinity,注意同一個應用程式中的activity的親和性在沒有修改的情況下是一樣的,所以下面的a情況會在同一個棧中),如果有,剛直接把這個棧整體移動到前臺,並保持棧中的狀態不變,即棧中的activity順序不變,如果沒有,則新建一個棧來存放被啟動的activity。
  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(兩種情況:1.從桌面啟動;2.從Activity A啟動,兩種情況一樣), 這時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(從桌面或者ActivityA啟動,也是一樣的),這時TaskB回到前臺, Activity D顯示,供使用者使用。說明了在此種情況下設定FLAG_ACTIVITY_NEW_TASK後,會先查詢是不是有Activity C存在的棧,根據親和性(taskAffinity),如果有,剛直接把這個棧整體移動到前臺,並保持棧中的狀態不變,即棧中的順序不變。

FLAG_ACTIVITY_NO_ANIMATION
  禁止activity之間的切換動畫
FLAG_ACTIVITY_NO_HISTORY
  該Activity將不在stack中保留,使用者一離開它,這個Activity就關閉了。
FLAG_ACTIVITY_NO_USER_ACTION
  禁止activity呼叫onUserLeaveHint()函。onUserLeaveHint()作為activity週期的一部分,它在activity因為使用者要跳轉到別的activity而退到background時使用。比如,在使用者按下Home鍵(使用者的操作),它將被呼叫。比如有電話進來(不屬於使用者的操作),它就不會被呼叫。注意:通過呼叫finish()時該activity銷燬時不會呼叫該函式。
FLAG_ACTIVITY_PREVIOUS_IS_TOP
  如果給Intent物件設定了這個標記,這個Intent物件被用於從一個存在的Activity中啟動一個新的Activity,那麼新的這個Activity不能用於接受傳送給頂層activity的intent,這個新的activity的前一個activity被作為頂部activity。
FLAG_ACTIVITY_REORDER_TO_FRONT
  如果在Intent中設定,並傳遞給Context.startActivity(),這個標誌將引發已經執行的Activity移動到歷史stack的頂端。 例如,假設一個Task由四個Activity組成:A,B,C,D。如果D呼叫startActivity()來啟動Activity B,那麼,B會移動到歷史stack的頂端,現在的次序變成A,C,D,B。如果FLAG_ACTIVITY_CLEAR_TOP標誌也設定的話,那麼這個標誌將被覆蓋。
FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
  這個標記在以下情況下會生效:1.啟動Activity時建立新的task來放置Activity例項;2.已存在的task被放置於前臺。系統會根據affinity對指定的task進行重置操作,task會壓入某些Activity例項或移除某些Activity例項。我們結合上面的FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET可以加深理解。
FLAG_ACTIVITY_RETAIN_IN_RECENTS
  api21加入。
  預設情況下通過FLAG_ACTIVITY_NEW_DOCUMENT啟動的activity在關閉之後,task中的記錄會相對應的刪除。如果為了能夠重新啟動這個activity你想保留它,就可以使用者個flag,最近的記錄將會保留在介面中以便使用者去重新啟動。接受該flag的activity可以使用autoRemoveFromRecents去複寫這個request或者呼叫Activity.finishAndRemoveTask()方法。
FLAG_ACTIVITY_SINGLE_TOP
  singleTop一樣
FLAG_ACTIVITY_TASK_ON_HOME
  api11加入。
  把當前新啟動的任務置於Home任務之上,也就是按back鍵從這個任務返回的時候會回到home,即使這個不是他們最後看見的activity,注意這個標記必須和FLAG_ACTIVITY_NEW_TASK一起使用。
FLAG_DEBUG_LOG_RESOLUTION
  將log置為可用狀態,如果設定了這個flag,那麼在處理這個intent的時候,將會列印相關建立日誌。
FLAG_EXCLUDE_STOPPED_PACKAGESFLAG_INCLUDE_STOPPED_PACKAGES
  在3.1之後,系統的package manager增加了對處於“stopped state”應用的管理,這個stopped和Activity生命週期中的stop狀態是完全兩碼事,指的是安裝後從來沒有啟動過和被使用者手動強制停止的應用,與此同時系統增加了2個Flag:FLAG_INCLUDE_STOPPED_PACKAGES和FLAG_EXCLUDE_STOPPED_PACKAGES ,來標識一個intent是否啟用處於“stopped state”的應用。當2個Flag都不設定或者都進行設定的時候,採用的是FLAG_INCLUDE_STOPPED_PACKAGES的效果。
FLAG_FROM_BACKGROUND
  用來標識該intent的操作是一個後端的操作而不是一個直接的使用者互動。
FLAG_GRANT_PERSISTABLE_URI_PERMISSION
  api19新增
  當和FLAG_GRANT_READ_URI_PERMISSION 和/或FLAG_GRANT_WRITE_URI_PERMISSION一起使用時,uri許可權在設定重啟之後依然存在直到使用者呼叫了revokeUriPermission(Uri, int)方法,這個標識僅為可能的存在狀態提供許可,接受的應用必須要呼叫takePersistableUriPermission(Uri, int)方法去實際的變為存在狀態。
FLAG_GRANT_PREFIX_URI_PERMISSION
  api21加入。
  當和FLAG_GRANT_READ_URI_PERMISSION 和/或FLAG_GRANT_WRITE_URI_PERMISSION一起使用時,uri的許可只用匹配字首即可(預設為全部匹配)。
FLAG_GRANT_READ_URI_PERMISSIONFLAG_GRANT_WRITE_URI_PERMISSION
  如果設定FLAG_GRANT_READ_URI_PERMISSION這個標記,Intent的接受者將會被賦予讀取Intent中URI資料的許可權和lipData中的URIs的許可權。當使用於Intent的ClipData時,所有的URIs和data的所有遞迴遍歷或者其他Intent的ClipData資料都會被授權。FLAG_GRANT_WRITE_URI_PERMISSION同FLAG_GRANT_READ_URI_PERMISSION只是相應的賦予的是寫許可權。
  一個典型的例子就是郵件程式處理帶有附件的郵件。進入郵件需要使用permission來保護,因為這些是敏感的使用者資料。然而,如果有一個指向圖片附件的URI需要傳遞給圖片瀏覽器,那個圖片瀏覽器是不會有訪問附件的權利的,因為他不可能擁有所有的郵件的訪問許可權。針對這個問題的解決方案就是per-URI permission:當啟動一個activity或者給一個activity返回結果的時候,呼叫方可以設定Intent.FLAG_GRANT_READ_URI_PERMISSION和/或Intent.FLAG_GRANT_WRITE_URI_PERMISSION . 這會使接收該intent的activity獲取到進入該Intent指定的URI的許可權,而不論它是否有許可權進入該intent對應的content provider。
FLAG_RECEIVER_FOREGROUND
  api16新增。
  當傳送廣播時,允許其接受者擁有前臺的優先順序,更短的超時間隔。
FLAG_RECEIVER_NO_ABORT
  api19新增
  如果這是一個有序廣播,不允許接受者終止這個廣播,它仍然能夠傳遞給下面的接受者。
FLAG_RECEIVER_REGISTERED_ONLY
  如果設定了這個flag,當傳送廣播的時,動態註冊的接受者才會被呼叫,在Androidmanifest.xml 裡定義的Receiver 是接收不到這樣的Intent 的。
FLAG_RECEIVER_REPLACE_PENDING
  api8新增。
  如果設定了的話,ActivityManagerService就會在當前的系統中檢視有沒有相同的intent還未被處理,如果有的話,就由當前這個新的intent來替換舊的intent,所以就會出現在傳送一系列的這樣的Intent 之後,中間有些Intent 有可能在你還沒有來得及處理的時候, 就被替代掉了的情況

  每個Activity都有taskAffinity屬性,這個屬性指出了它希望進入的Task。如果一個Activity沒有顯式的指明該 Activity的taskAffinity,那麼它的這個屬性就等於Application指明的taskAffinity,如果 Application也沒有指明,那麼該taskAffinity的值就等於包名。而Task也有自己的affinity屬性,它的值等於它的根 Activity的taskAffinity的值。
  TaskAffinity屬性主要和SingleTask啟動模式或者allowTaskReparenting屬性配對使用,在其他情況下沒有意義。當TaskAffinity和singleTask啟動模式配對使用的時候,他是具有該模式的Activity的目前任務棧的名字,待啟動的Activity會執行在名字和TaskAffinity相同的任務棧中。allowTaskReparenting用於配置是否允許該activity可以更換從屬task,通常情況二者連在一起使用,用於實現把一個應用程式的Activity移到另一個應用程式的Task中。allowTaskReparenting用來標記Activity能否從啟動的Task移動到taskAffinity指定的Task,預設是繼承至application中的allowTaskReparenting=false,如果為true,則表示可以更換;false表示不可以。
  如果載入某個Activity的intent,Flag被設定成FLAG_ACTIVITY_NEW_TASK時,它會首先檢查是否存在與自己taskAffinity相同的Task,如果存在,那麼它會直接宿主到該Task中,如果不存在則重新建立Task。

引用

相關推薦

Android activity棧、啟動模式intent flag屬性詳解

一、Activity棧的概念        1.每個app應用程式啟動的activity都會儲存在一個單獨的棧裡面。        2.有可能某個activity發生棧轉移。二、acitivity的

android深入解析Activity的launchMode啟動模式Intent FlagtaskAffinity

  最近看到一篇文章講launchMode,想到以前的一次面試,就問了這一個問題,最基本的大家都知道,但是詳細的我就迷糊了,最終失敗了,所以在此總結一下,希望能夠幫助一下大家   launchMode分為四種:    standard   s

Activity 的啟動模式有4種分別是standard、singleTop、singleTask、singleInstance

class logs () png img 函數 pan tac span 關於安卓部分知識 Activity 的啟動模式有4種,分別是standard、singleTop、singleTask、singleInstance 1.standar (標準啟動模式) 這是Act

[Android]Activity生命週期+啟動模式

Activity是一個與使用者互動的介面。 一、Activity生命週期  1.Activity的4種狀態      Active  Paused  Stopped  killed Active:當前

Android中Activity的啟動模式(LaunchMode)和使用場景

一、為什麼需要啟動模式 在Android開發中,我們都知道,在預設的情況下,如果我們啟動的是同一個Activity的話,系統會建立多個例項並把它們一一放入任務棧中。當我們點選返回(back)鍵,這些Activity例項又將從任務棧中一一移除,遵循的原則是“

Android深入解析】Manifest配置檔案解析(上)(英文版)

<action> 語法規則: <action android:name="string"/> 描述 : Adds an action to an intentfilter. An elementmust contain one or more

Android activity四種啟動模式taskAffinity屬性總結(附例子原始碼)

Android activity四種啟動模式總結本人目前在看 Android 開發藝術探索 這本書,書中對啟動模式的講解比較詳細,所以自己想總結下。如果各位能認真的看上一遍,相信會對android activity的啟動模式會有更加深刻的印象。Android啟動模式:   

Android歸納】Activity啟動模式

1、對於使用standard 模式的活動,系統不會在乎這個活動是否已經在返回棧中存在,每次啟動都會建立該活動的一個新的例項。 例如A啟動A,A再接著啟動A,A繼續啟動A,然後再分別出棧,如圖所示

Android深入探究筆記之二十 -- 廣播接收者BroadcastReceiver

廣播接收者 -- BroadcastReceiver 1. 概述        廣播被分為兩種不同的型別:“普通廣播(Normal broadcasts)”和“有序廣播(Ordered broadcasts)”。        普通廣播是完全非同步的,可以在同一時刻(邏輯上

Android 深入解析AsyncTask(doInBackground不工作)

近日開發遇到AsyncTask的doInBackground()方法不執行的問題,所以在網上查詢原因,以下博文解決了我的問題,我用Thread代替了AysncTask進行工作。博文如下: 地址:http://blog.csdn.net/hitlion2008/article/details/7983

Android之Activity的啟動模式

在Android中每個介面都是一個Activity,切換介面操作其實是多個不同Activity之間的例項化操作。在Android中Activity的啟動模式決定了Activity的啟動執行方式。 Android總Activity的啟動模式分為四種: Activity啟動模式設定:         <a

Android 深入解析selector

第一種是在listview中配置android:listSelector="@drawable/list_item_bg" 或者在listview的item中新增屬性android:background=“@drawable/list_item_bg"即可實現。 或者在java程式碼中使用: Drawabl

android launchmode(四種啟動模式)應用場景及例項

我們在開發專案的過程中,會涉及到該應用中多個Activity元件之間的跳轉,或者夾帶其它應用的可複用的Activity。例如我們可能希望跳轉到原來某個Activity例項,而不是產生大量重複的 Activity。這樣就需要我們為 Activity 配置特定的載入模式,而不

Activity啟動模式IntentFlag屬性對Intent傳值的影響

前些時候在支援公司其它部門專案開發的時候,有同事問我:通過Intent在Activity之間進行資料傳遞,傳遞的Key和獲取的Key都沒錯,為什麼在目標Activity會獲取不到傳遞過來的資料?在Key沒錯的情況下獲取不到資料,那麼無疑是Activity的啟動模式及在跳轉時

android的四種啟動模式

5、當你在TwoActivity類中點選back鍵返回的時候,你會發現,他沒有直接返回到FirstActivity,而是直接返回到了MainActivity中,再次點選back時候它才返回FirstActivity中。其實原因是因為MainActivity和TwoActivity是同一個棧,同一個棧返回完了之

深入解析Oracle IMU模式下的REDO格式

這個話題討論在ITPUB,連結:http://www.itpub.net/thread-1838538-1-1.html 1. 什麼是IMU?IMU的主要作用是什麼,也就是說為了解決什麼問題? IMU--->In Memory Undo,10g新特性,資料庫會在sha

android 中activity的啟動模式是singleTask時清除activity的棧頂activity的生命週期小計

安卓開發中經常會涉及到activity啟動模式,當一個activity第singleTASK時 ,清除棧頂的activity的時候,位於棧頂的activity的生命週期是如何走完的呢?這裡做一個小計: BaseActivity的 啟動模式是singleTask模式   

帶你深入理解Activity啟動模式(LaunchMode)

我們知道預設情況下,當我們多次啟動同一個activity時,系統會建立多個例項並把他們一個個放入任務棧,當我們按back鍵,這些activity又會一個個退出。在講activity的launchmode之前,我們有必要了解下“任務棧(Task Stack)”這個

python 跳出多層迴圈的辦法使用flag

one = ['a','b','c','d'] two = [1,2,3,4] flag = False for i in one: if flag == True: break print i if i == 'b': for m

Android-intent.addFlags-Activity啟動模式

之前寫的Android-Activity啟動模式(launchMode),Android-Activity啟動模式-應用場景,講解的都是在AndroidManifest.xml配置launchMode="四種啟動模式" Activity啟動模式分為四種:      如果不配置:launchMode,預設