<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                最近想寫篇關于Activity啟動過程源碼分析的博客,在此之前先總結下Android中Activity必須要知道的一些基礎知識,以方便后面能看懂Activity的源碼。 ### 一,Activity生命周期和啟動模式 activity最經典的啟動模式圖如下: ![](https://box.kancloud.cn/2016-04-08_570771b66a3fc.jpg) 它分為onCreate--onStart--onResume--onPause--onStop--onDestory.這幾個階段,這個是個android開發者肯定都很熟悉,這里不詳細說,只是說下一些注意事項: 1.onStart和onStop的區別:onStart表示應用己經可見,但只運行在后臺,沒到前臺。onStop表示acitvity運行在后臺。當用戶使用透明主題,不會調用onstop. 2.onResume和onpause的區別:這兩個是從activity是否位于前臺來回調的,是一組。 3.當新Activity啟動之前,棧頂acitivity需要先onPause新的再啟動。所以不能在onpause中做耗時操作。? 4.當activity異常停止時,會調用onSaveInstanceState,并把所保存的Bundle傳遞給onRestoreInstanceState,onRestoreInstanceState是在onStart之后被調用。過程是onSaveInstanceState先保存數據,Activity會委托Window保存數據,接著Window再委托上面的頂級容器去保存,一直往上委托直到DecorView,最后它再一一通知它的子元素來保存數據。典型的委托思想。 ?? 如果onRestoreInstanceState被調用 ,那它的onSaveInstanceState參數一定有值。 5.在資源不足情況下導致的activity被殺死也會調用onSaveInstanceState。activity有三個優先級: * 前臺activity。 * 可見但非前臺activity(如Dialog) * 后臺activity(onstop的情況)。 ### 二,啟動模式 1.啟動模式介紹: android有四種模式,分別是standard,singleTop,singleTask,singleInstance。 standard:一個任務棧可以有多個實例,每個實例可以屬于不同任務棧。每新建一個activity就新建一個實例。一個實例被哪個實例創建,就存在哪個實例所在的棧中,如A啟動了B,那么B就位于A的棧中。不能在appliactionContext中啟動它,因為非activity的context沒有任務棧,解決方法是加上FLAG_ACTIVITY_NEW_TASK標識,會新建一個任務棧。 singleTop:如果activity存在棧頂,此時activity不會被重建,它的oncreate等方法不會被重調用 。如棧中有ABC,再啟動C,就不會重新創建C。 singleTask:棧內復用模式,首先判斷所需要的棧是否在否存在,若存在,那么只要在棧中存在,就不新建實例,并cleanTop,如果不存在,新建實例。如果所要的棧都不存在,新建棧。如棧中有ABCD,啟動C,C指定了所需的棧且棧不存在,那么就會創建一個新棧,并把C存入,此時就存在兩個棧,一個是ABC,一個是C。如棧中有ABCD,啟動的C所需的棧就是ABCD所在的棧,那就會把C置于棧項,C上的所有實例出棧,此時棧就變成了ABC。那么如何指定所需任務棧。一般使用TaskAffinity來指定,下面會說明。 singleInstance:具有singleTask的所有特性。不同的是,具有此模式的acitivity只能單獨位于一個棧中。如創建了A,A在一個棧中,后續再創建A就不會再創建實例了。 指定啟動模式有兩種設置方法: 在xml中設置:andorid:launchMode="singleTop" 在代碼中設置:intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);這種方法的優點是優先級比第一種高,比如同時用兩種方法設置,那以第二種為主,缺點是它不能設置singleInstance。 2.所需任務棧: TaskAffinity:標識了一個activity所需要的任務棧名稱。默認為應用的包名。主要和singleTask配對使用。 任務棧分為前臺和后臺任務棧。后臺 任務棧是指位于暫停的狀態。用戶可以切換將后臺再次調到前臺。 A啟動B,則B會位于A的任務棧中。(沒有TaskAffinity情況下)? 比如A啟動B,B的TaskAffinity與A的不同,那就會創建新任務棧并把B放入。 AB是前臺棧,CD是后臺棧,B啟動D,則變成ABCD,啟動C則變成ABC. 3.標志位: 我們經常會在代碼中指定標志位,主要的標志位有以下幾種: FLAG_ACTIVITY_NEW_TASK:類似singleTask FLAG_ACTIVITY_SINGLE_TOP:類似singleTop FLAG_ACTIVITY_CLEAN_TOP:清當前activity棧中它本身以上的activity FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:具有這個標記的activity不會出現在歷史activity列表中。只需設置 android:excludeFromRecents="true" ### 三,IntentFilter匹配規則 啟動activity有顯式和隱式兩種,如果是隱式,就要滿足IntentFilter匹配規則。 intent 有action,category,data.三個屬性。只有一個intent同時匹配了action,category和data才算完全匹配。有多個filter只要有一個匹配就可以。 action只要有一個匹配就可以。 category:如果intent有這個屬性,那它所有的category都必須匹配上。可以沒有。沒有默認有DEFAULT這個屬性。為了我們的activity能接受隱式調用,就必須加上android.intent.category.DEFAULT這個屬性。 data:與action類似。它為分為兩部分。mimeType,URL.mineType指媒體類型,如image/jpeg等,URL如下 [http://www.baidu.com:80/search/info](http://www.baidu.com/search/info) URL默認是content和file,在不指定data 情況下就是匹配它。調用的方法如下 intent.setDataAndType(Uri.parse("file://abc"),"image/png") 完整的代碼如下:? ~~~ Intent intent = new Intent("com.lxj.a"); intent.addCategory("com.lxj.b"); intent.setDataAndType(Uri.parse("file://abc"),"image/png") startActivity(intent); 匹配的是如下的activity <activity …………> <intent-filter> <action android:name="com.lxj.a"/> <actegory android:name="com.lxj.b"/> <actegory android:name="android.intent.category.DEFAULT"/> <data android:mimeType="text/plain"/> <data android:mimeType="image/*"/> </intent-filter> <activity/> ~~~ 就先寫這么多吧,下一篇我會介紹下我對activity啟動源碼的理解。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看