欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

  • <samp id="q4kks"></samp>

    android基礎(chǔ)總結(jié)篇之二:Activity的四種launchMode

     更新時間:2016年11月16日 17:08:04   作者:liuhe688  
    這篇文章主要介紹了android基礎(chǔ)總結(jié)篇之二:Activity的四種launchMode,有需要的可以了解一下。

    我們今天要講的是Activity的四種launchMode。

    launchMode在多個Activity跳轉(zhuǎn)的過程中扮演著重要的角色,它可以決定是否生成新的Activity實例,是否重用已存在的Activity實例,是否和其他Activity實例公用一個task里。這里簡單介紹一下task的概念,task是一個具有棧結(jié)構(gòu)的對象,一個task可以管理多個Activity,啟動一個應(yīng)用,也就創(chuàng)建一個與之對應(yīng)的task。

    Activity一共有以下四種launchMode:

    1.standard

    2.singleTop

    3.singleTask

    4.singleInstance

    我們可以在AndroidManifest.xml配置<activity>的Android:launchMode屬性為以上四種之一即可。

    下面我們結(jié)合實例一一介紹這四種lanchMode:

    1.standard

    standard模式是默認的啟動模式,不用為<activity>配置android:launchMode屬性即可,當然也可以指定值為standard。
    我們將會一個Activity,命名為FirstActivity,來演示一下標準的啟動模式。FirstActivity代碼如下:

    package com.scott.launchmode; 
     
    import android.app.Activity; 
    import android.content.Intent; 
    import android.os.Bundle; 
    import android.view.View; 
    import android.widget.Button; 
    import android.widget.TextView; 
     
    public class FirstActivity extends Activity { 
      @Override 
      public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.first); 
        TextView textView = (TextView) findViewById(R.id.textView); 
        textView.setText(this.toString()); 
        Button button = (Button) findViewById(R.id.button); 
        button.setOnClickListener(new View.OnClickListener() { 
          @Override 
          public void onClick(View v) { 
            Intent intent = new Intent(FirstActivity.this, FirstActivity.class); 
            startActivity(intent); 
          } 
        }); 
      } 
    } 
    

    我們FirstActivity界面中的TextView用于顯示當前Activity實例的序列號,Button用于跳轉(zhuǎn)到下一個FirstActivity界面。

    然后我們連續(xù)點擊幾次按鈕,將會出現(xiàn)下面的現(xiàn)象:


    我們注意到都是FirstActivity的實例,但序列號不同,并且我們需要連續(xù)按后退鍵兩次,才能回到第一個FristActivity。standard模式的原理如下圖所示:

    如圖所示,每次跳轉(zhuǎn)系統(tǒng)都會在task中生成一個新的FirstActivity實例,并且放于棧結(jié)構(gòu)的頂部,當我們按下后退鍵時,才能看到原來的FirstActivity實例。

    這就是standard啟動模式,不管有沒有已存在的實例,都生成新的實例。

    2.singleTop

    我們在上面的基礎(chǔ)上為<activity>指定屬性android:launchMode="singleTop",系統(tǒng)就會按照singleTop啟動模式處理跳轉(zhuǎn)行為。我們重復(fù)上面幾個動作,將會出現(xiàn)下面的現(xiàn)象:




    我們看到這個結(jié)果跟standard有所不同,三個序列號是相同的,也就是說使用的都是同一個FirstActivity實例;如果按一下后退鍵,程序立即退出,說明當前棧結(jié)構(gòu)中只有一個Activity實例。singleTop模式的原理如下圖所示:
    正如上圖所示,跳轉(zhuǎn)時系統(tǒng)會先在棧結(jié)構(gòu)中尋找是否有一個FirstActivity實例正位于棧頂,如果有則不再生成新的,而是直接使用。也許朋友們會有疑問,我只看到棧內(nèi)只有一個Activity,如果是多個Activity怎么辦,如果不是在棧頂會如何?我們接下來再通過一個示例來證實一下大家的疑問。

    我們再新建一個Activity命名為SecondActivity,如下:

    package com.scott.launchmode; 
     
    import android.app.Activity; 
    import android.content.Intent; 
    import android.os.Bundle; 
    import android.view.View; 
    import android.widget.Button; 
    import android.widget.TextView; 
     
    public class SecondActivity extends Activity { 
      @Override 
      protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.second); 
        TextView textView = (TextView) findViewById(R.id.textView); 
        textView.setText(this.toString()); 
        Button button = (Button) findViewById(R.id.button); 
        button.setOnClickListener(new View.OnClickListener() { 
          @Override 
          public void onClick(View v) { 
            Intent intent = new Intent(SecondActivity.this, FirstActivity.class); 
            startActivity(intent);        
          } 
        }); 
      } 
    } 
    

    然后將之前的FirstActivity跳轉(zhuǎn)代碼改為:

    Intent intent = new Intent(FirstActivity.this, SecondActivity.class); 
    startActivity(intent); 

    是的,F(xiàn)irstActivity會跳轉(zhuǎn)到SecondActivity,SecondActivity又會跳轉(zhuǎn)到FirstActivity。演示結(jié)果如下:




    我們看到,兩個FirstActivity的序列號是不同的,證明從SecondActivity跳轉(zhuǎn)到FirstActivity時生成了新的FirstActivity實例。原理圖如下:

    我們看到,當從SecondActivity跳轉(zhuǎn)到FirstActivity時,系統(tǒng)發(fā)現(xiàn)存在有FirstActivity實例,但不是位于棧頂,于是重新生成一個實例。

    這就是singleTop啟動模式,如果發(fā)現(xiàn)有對應(yīng)的Activity實例正位于棧頂,則重復(fù)利用,不再生成新的實例。

    3.singleTask

    在上面的基礎(chǔ)上我們修改FirstActivity的屬性android:launchMode="singleTask"。演示的結(jié)果如下:



    我們注意到,在上面的過程中,F(xiàn)irstActivity的序列號是不變的,SecondActivity的序列號卻不是唯一的,說明從SecondActivity跳轉(zhuǎn)到FirstActivity時,沒有生成新的實例,但是從FirstActivity跳轉(zhuǎn)到SecondActivity時生成了新的實例。singleTask模式的原理圖如下圖所示:

    在圖中的下半部分是SecondActivity跳轉(zhuǎn)到FirstActivity后的棧結(jié)構(gòu)變化的結(jié)果,我們注意到,SecondActivity消失了,沒錯,在這個跳轉(zhuǎn)過程中系統(tǒng)發(fā)現(xiàn)有存在的FirstActivity實例,于是不再生成新的實例,而是將FirstActivity之上的Activity實例統(tǒng)統(tǒng)出棧,將FirstActivity變?yōu)闂m攲ο螅@示到幕前。也許朋友們有疑問,如果將SecondActivity也設(shè)置為singleTask模式,那么SecondActivity實例是不是可以唯一呢?在我們這個示例中是不可能的,因為每次從SecondActivity跳轉(zhuǎn)到FirstActivity時,SecondActivity實例都被迫出棧,下次等FirstActivity跳轉(zhuǎn)到SecondActivity時,找不到存在的SecondActivity實例,于是必須生成新的實例。但是如果我們有ThirdActivity,讓SecondActivity和ThirdActivity互相跳轉(zhuǎn),那么SecondActivity實例就可以保證唯一。

    這就是singleTask模式,如果發(fā)現(xiàn)有對應(yīng)的Activity實例,則使此Activity實例之上的其他Activity實例統(tǒng)統(tǒng)出棧,使此Activity實例成為棧頂對象,顯示到幕前。

    4.singleInstance

    這種啟動模式比較特殊,因為它會啟用一個新的棧結(jié)構(gòu),將Acitvity放置于這個新的棧結(jié)構(gòu)中,并保證不再有其他Activity實例進入。

    我們修改FirstActivity的launchMode="standard",SecondActivity的launchMode="singleInstance",由于涉及到了多個棧結(jié)構(gòu),我們需要在每個Activity中顯示當前棧結(jié)構(gòu)的id,所以我們?yōu)槊總€Activity添加如下代碼:

    TextView taskIdView = (TextView) findViewById(R.id.taskIdView); 
    taskIdView.setText("current task id: " + this.getTaskId()); 

    然后我們再演示一下這個流程:

    我們發(fā)現(xiàn)這兩個Activity實例分別被放置在不同的棧結(jié)構(gòu)中,關(guān)于singleInstance的原理圖如下:
    我們看到從FirstActivity跳轉(zhuǎn)到SecondActivity時,重新啟用了一個新的棧結(jié)構(gòu),來放置SecondActivity實例,然后按下后退鍵,再次回到原始棧結(jié)構(gòu);圖中下半部分顯示的在SecondActivity中再次跳轉(zhuǎn)到FirstActivity,這個時候系統(tǒng)會在原始棧結(jié)構(gòu)中生成一個FirstActivity實例,然后回退兩次,注意,并沒有退出,而是回到了SecondActivity,為什么呢?是因為從SecondActivity跳轉(zhuǎn)到FirstActivity的時候,我們的起點變成了SecondActivity實例所在的棧結(jié)構(gòu),這樣一來,我們需要“回歸”到這個棧結(jié)構(gòu)。

    如果我們修改FirstActivity的launchMode值為singleTop、singleTask、singleInstance中的任意一個,流程將會如圖所示:
    singleInstance啟動模式可能是最復(fù)雜的一種模式,為了幫助大家理解,我舉一個例子,假如我們有一個share應(yīng)用,其中的ShareActivity是入口Activity,也是可供其他應(yīng)用調(diào)用的Activity,我們把這個Activity的啟動模式設(shè)置為singleInstance,然后在其他應(yīng)用中調(diào)用。我們編輯ShareActivity的配置:

    <activity android:name=".ShareActivity" android:launchMode="singleInstance"> 
      <intent-filter> 
        <action android:name="android.intent.action.MAIN" /> 
        <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
      <intent-filter> 
        <action android:name="android.intent.action.SINGLE_INSTANCE_SHARE" /> 
        <category android:name="android.intent.category.DEFAULT" /> 
      </intent-filter> 
    </activity> 
    

    然后我們在其他應(yīng)用中這樣啟動該Activity:

    Intent intent = new Intent("android.intent.action.SINGLE_INSTANCE_SHARE"); 
    startActivity(intent); 

    當我們打開ShareActivity后再按后退鍵回到原來界面時,ShareActivity做為一個獨立的個體存在,如果這時我們打開share應(yīng)用,無需創(chuàng)建新的ShareActivity實例即可看到結(jié)果,因為系統(tǒng)會自動查找,存在則直接利用。大家可以在ShareActivity中打印一下taskId,看看效果。關(guān)于這個過程,原理圖如下:

    原文鏈接:http://blog.csdn.net/liuhe688/article/details/6754323

    以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

    相關(guān)文章

    • Android中 service組件詳解

      Android中 service組件詳解

      Service是Android的四大組件之一,以下是我結(jié)合Android Doc和網(wǎng)上資料的學(xué)習(xí)總結(jié),有不準確的地方請高手指出,互相學(xué)習(xí)嘛。。。
      2016-08-08
    • Android中Bitmap用法實例分析

      Android中Bitmap用法實例分析

      這篇文章主要介紹了Android中Bitmap用法,結(jié)合實例形式分析了Android操作圖片的載入、屬性設(shè)置、旋轉(zhuǎn)等相關(guān)技巧,需要的朋友可以參考下
      2016-02-02
    • Android開啟動畫之漸隱漸現(xiàn)效果

      Android開啟動畫之漸隱漸現(xiàn)效果

      這篇文章主要為大家詳細介紹了Android開啟動畫之漸隱漸現(xiàn)效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
      2018-07-07
    • Android 監(jiān)聽鎖屏、解鎖、開屏 功能代碼

      Android 監(jiān)聽鎖屏、解鎖、開屏 功能代碼

      這篇文章主要介紹了Android 監(jiān)聽鎖屏、解鎖、開屏 功能代碼的相關(guān)資料,需要的朋友可以參考下
      2016-06-06
    • Android自定義view利用PathEffect實現(xiàn)動態(tài)效果

      Android自定義view利用PathEffect實現(xiàn)動態(tài)效果

      這篇文章主要為大家詳細介紹了Android自定義view利用PathEffect實現(xiàn)動態(tài)效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
      2022-05-05
    • Android中檢測當前是否為主線程最可靠的解決方法

      Android中檢測當前是否為主線程最可靠的解決方法

      這篇文章主要介紹了Android中檢測當前是否為主線程最可靠的解決方法,本文先是給出了最可靠的方法,然后給出了幾個實驗例子,需要的朋友可以參考下
      2015-01-01
    • Android 自定義底部上拉控件的實現(xiàn)方法

      Android 自定義底部上拉控件的實現(xiàn)方法

      下面小編就為大家分享一篇Android 自定義底部上拉控件的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
      2018-01-01
    • Android 應(yīng)用簽名的兩種方法

      Android 應(yīng)用簽名的兩種方法

      這篇文章主要介紹了Android 應(yīng)用簽名的兩種方法的相關(guān)資料,這里提供了兩種實現(xiàn)方法分別實現(xiàn)簽名,希望能幫助到大家,需要的朋友可以參考下
      2017-08-08
    • Android編程實現(xiàn)滑動開關(guān)組件功能【附源碼下載】

      Android編程實現(xiàn)滑動開關(guān)組件功能【附源碼下載】

      這篇文章主要介紹了Android編程實現(xiàn)滑動開關(guān)組件功能,結(jié)合實例形式詳細分析了Android滑動開關(guān)組件的簡單布局與功能實現(xiàn)技巧,并附帶完整實例源碼供讀者下載參考,需要的朋友可以參考下
      2018-01-01
    • Android入門之源碼開發(fā)基礎(chǔ)教程

      Android入門之源碼開發(fā)基礎(chǔ)教程

      這篇文章主要介紹了Android入門之源碼開發(fā)基礎(chǔ)教程,分析了環(huán)境搭建、模擬器使用及編譯文件的相關(guān)技巧與注意事項,需要的朋友可以參考下
      2016-02-02

    最新評論