(Android第一行代碼)活動的啟動模式

來源:互聯網
上載者:User

標籤:create   class   不同   efault   win   tco   實現   font   line   

活動的啟動模式

啟動模式一共有四種,分別是 standard、singleTop、 singleTask 和 singleInstance,可以在 AndroidManifest.xml 中通過給<activity>標籤指定 android:launchMode屬性來選擇啟動模式。下面我們來逐個進行學習。

1.standard模式:(對於使用 standard 模式的活動,系統不會在乎這個活動是否已經在返回棧中存在,每次啟動都會建立 該活動的一個新的執行個體。)

  是活動預設的啟動模式

 修改 FirstActivity中 onCreate()方法的代碼,如下所示:

               @Override

     protected void onCreate(Bundle savedInstanceState) { 

            super.onCreate(savedInstanceState); 

          //從列印資訊中我們就可以看出,每點擊一次按鈕就會建立出一個新的 FirstActivity執行個體我們需要按三次back才能退出程式。

            Log.d("FirstActivity", this.toString()); 

            requestWindowFeature(Window.FEATURE_NO_TITLE); 

            setContentView(R.layout.first_layout); 

            Button button1 = (Button) findViewById(R.id.button_1);

           button1.setOnClickListener(new OnClickListener() { 

               @Override

          public void onClick(View v) { 

             //我們,在 FirstActivity的基礎上啟動 FirstActivity。

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

                    startActivity(intent);

             }

           });

     }

2.singleTop模式(在啟動活動時如果發現返回棧的棧頂已經是該活動,則認為可以直接使用 它,不會再建立新的活動執行個體。)

       修改 AndroidManifest.xml中 FirstActivity的啟動模式,

        <activity    

              android:name=".FirstActivity"

           //修改 AndroidManifest.xml中 FirstActivity的啟動模式,

              android:launchMode="singleTop" 

             android:label="This is FirstActivity" > 

             <intent-filter>    

                 <action android:name="android.intent.action.MAIN" /> 

                 <category android:name="android.intent.category.LAUNCHER" /> 

             </intent-filter>

      </activity>

 然後重新運行程式,查看 LogCat會看到已經建立了一個 FirstActivity的執行個體.僅按一次 Back鍵就可以退出程式。不過當 FirstActivity並未處於棧頂位置時,這時再啟動 FirstActivity,還是會建立新的實 例的。

3.singleTask模式(當活動的啟動模式指定為 singleTask,每次啟動該活動時系統首先 會在返回棧中檢查是否存在該活動的執行個體,如果發現已經存在則直接使用該執行個體,並把在這 個活動之上的所有活動統統出棧,如果沒有發現就會建立一個新的活動執行個體。)

  •  修改 AndroidManifest.xml中 FirstActivity的 啟動模式

      <activity  

               android:name=".FirstActivity"

        //修改 AndroidManifest.xml中 FirstActivity的 啟動模式

               android:launchMode="singleTask" 

               android:label="This is FirstActivity" >   

          <intent-filter>       

               <action android:name="android.intent.action.MAIN" />      

               <category android:name="android.intent.category.LAUNCHER" /> 

        </intent-filter>

     </activity>

  •     然後在 FirstActivity中添加 onRestart()方法,並列印日誌:

      @Override

       protected void onRestart() { 

             super.onRestart(); 

             Log.d("FirstActivity", "onRestart");

   }

  •   最後在 SecondActivity中添加 onDestroy()方法,並列印日誌:

       @Override protected void onDestroy() { 

                    super.onDestroy();

             Log.d("SecondActivity", "onDestroy");

   }

在 SecondActivity 中啟動 FirstActivity 時,會發 現返回棧中已經存在一個 FirstActivity 的執行個體,並且是在 SecondActivity 的下面,於是 SecondActivity 會從返回棧中出棧,而 FirstActivity 重新成為了棧頂活動,因此 FirstActivity 的 onRestart()方法和 SecondActivity的 onDestroy()方法會得到執行。

4.singleInstance模式(指定為 singleInstance模式的活動會啟用一 個新的返回棧來管理這個活動)

     使用情境:假設我們的程式中有一個 活動是允許其他程式調用的,如果我們想實現其他程式和我們的程式可以共用這個活動的執行個體。?使用前面三種啟動模式肯定是做不到的,因為每個    應用程式都會有自 己的返回棧,同一個活動在不同的返回棧中入棧時必然是建立了新的執行個體。而使用 singleInstance模式就可以解決這個問題,在這種模式下會有一個單獨的返回棧來管理這個活 動,不管是哪個應用程式來訪問這個活動,都共用的同一個返回棧。

  • 修改 AndroidManifest. xml中 SecondActivity的啟動模式:

         <activity 

               android:name=".SecondActivity" 

         //修改 AndroidManifest. xml中 SecondActivity的啟動模式:

               android:launchMode="singleInstance" >  

              <intent-filter>  

                    <action android:name="com.example.activitytest.ACTION_START" />    

                    <category android:name="android.intent.category.DEFAULT" />     

                    <category android:name="com.example.activitytest.MY_CATEGORY" /> 

                    </intent-filter>

             </activity>

  •      修改 FirstActivity 中 onCreate()方法的代碼,在 onCreate()方法中列印了當前返回棧的 id.

               Log.d("FirstActivity", "Task id is " + getTaskId());

  •      修改 SecondActivity中 onCreate()方法 的代碼,列印了當前返回棧的 id.

                Log.d("SecondActivity", "Task id is " + getTaskId());

  •      最後修改 ThirdActivity中 onCreate()方法仍然是在 onCreate()方法中列印了當前返回棧的 id.

                 Log.d("ThirdActivity", "Task id is " + getTaskId());

      列印結果:

 可以看到,SecondActivity 的 Task id 不同於 FirstActivity 和 ThirdActivity,這說明 SecondActivity確實是存放在一個單獨的返回棧裡的,而且這個棧中只有 SecondActivity這一 個活動。

   

       

   

  

     

  

(Android第一行代碼)活動的啟動模式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.