Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android activity四大啟動模式詳解

Android activity四大啟動模式詳解

編輯:關於Android編程

Activity中四大啟動模式

在AndroidManifest.xml中 ,有一個默認的activity 在它裡面可以設置activity啟動模式, android:launchMode="“ ,該屬性用於配置Activity的加載模式,該屬性支持4中屬性 每不同的模式出現不同的效果,下面詳解啟動模式。

standard:標准模式,默認加載模式

singleTop:Task頂單例模式
singleTask:Task內單例模式
singleInstance:全局單單例模式


1 Activity為什麼要用指定模式??

首先介紹下Android對Activity的管理:Android采用Task來管理多個Activity,當我們啟動一個Activity時,系統就會創建一個Task,然後啟動這個Activity的入口。
Android並未給Task提供API,只能通過調用Activity的getTaskId()方法獲取它所在的Task的ID,我們可以把Task理解為Activity 棧,Task以棧來管理Activity。


2.四大啟動模式的理解


standard加載模式

每次通過這種模式啟動Activity時,Android總會為啟動的Activity創建一個新的實例,並將該Activity添加到當前Task棧中,這種模式不會創建新的Task,只是將新
Activity添加到原有的Task 中

\

singleTop模式<喎?/kf/ware/vc/" target="_blank" class="keylink">vc3Ryb25nPjwvcD4KPHA+PGJyPgo8L3A+CjxwPsjnufvU2sjOzvG1xNW7tqXV/brDtObU2rjDQWN0aXZpdHm1xMq1wP2jrCC+zdbY08O4w8q1wP2jrLfx1d++zbvhtLS9qNDCtcTKtcD9sqK3xcjr1bu2pSi8tMq51bvW0NLRvq205tTauMNBY3Rpdml0ecq1wP2jrNa70qqyu9Ta1bu2paOstry74bS0vajKtcD9KaGjPGJyPgo8L3A+CjxwPjxicj4KPC9wPgo8cD48c3Ryb25nPnNpbmdsZVRhc2vEo8q9PC9zdHJvbmc+PGJyPgo8YnI+Cjxicj4KsbvG9LavtcRBY3Rpdml0edTazazSu7j2VGFza8Ta1rvT0NK7uPZBY3Rpdml0ecq1wP0svt/M5bfWzqrI58/CyP3W1sfpv/ajujxicj4KPGJyPgo8YnI+CjwxPi7I57n7xvS2r7XExL+x6kFjdGl2aXR5sru05tTaVGFza9W71tAsz7XNs72ru+G0tL2o0ru49sS/sepBY3Rpdml0ecq1wP0ssqK9q8v8vNPI67W9VGFza9W7tqU8YnI+Cjxicj4KPGJyPgo8Mj4uyOe5+8b0tq+1xMS/sepBY3Rpdml0edLRtObU2lRhc2vVu7alLLTLyrHEo8q9us1zaW5nbGVUb3DEo8q9z+DNrDxicj4KPGJyPgo8YnI+CjwzPi7I9Ln7xvS2r7XExL+x6kFjdGl2aXR50tG05tTatavDu9PQzrvT2lRhc2vVu7alLM+1zbO9q7vhsNG4w8S/sepBY3Rpdml0ecnPw+a1xMv509BBY3Rpdml0edLGs/1UYXNr1bssyrm4w0FjdGl2aXR51sPT2lRhc2vVu7alPGJyPgo8L3A+CjxwPjxicj4KPC9wPgo8cD48c3Ryb25nPnNpbmdsZUluc3RhbmNlxKPKvTwvc3Ryb25nPjxicj4KPGJyPgrV4tbWvNPU2MSjyr3PwizO3sLbtNPExLj2VGFza9bQxvS2r8S/sepBY3Rpdml0eSzWu7vhtLS9qNK7uPbEv7HqQWN0aXZpdHnKtcD9LLKiu+HKudPD0ru49sir0MK1xFRhc2vVu8C017DU2LjDQWN0aXZpdHnKtcD9oaO+38zlv8m31s6qwb3W1sfpv/ajujxicj4KPGJyPgo8YnI+CjwxPi7I57n7tLS9qLXExL+x6kFjdGl2aXR5sru05tTaLM+1zbPPyLvhtLS9qNK7uPbIq9DCtcRUYXNrLL3T18W0tL2o0ru49kFjdGl2aXR5yrXA/SzIu7rzvau4w8S/sepBY3Rpdml0ebzTyOu1vdDCtcRUYXNr1bu2pTxicj4KPGJyPgo8YnI+CjwyPi7I57n7tLS9qLXExL+x6kFjdGl2aXR50tG+rbTm1Noszt7C29TaxMS49lRhc2vVu9bQLM+1zbO9q7vhsNFBY3Rpdml0ecv51Nq1xNW71sPT2sewzKihozxicj4KPGJyPgo8YnI+Ctei0uKjurLJ08NzaW5nbGVJbnN0YW5jZbzT1NjEo8q9tcRBY3Rpdml0edfcysfOu9PaVGFza9W7tqUssqLH0kFjdGl2aXR5y/nU2rXEVGFza9W71ruw/LqsuMNBY3Rpdml0eaGjPGJyPgo8L3A+CjxwPjxicj4KPC9wPgo8cD48YnI+CjwvcD4KPHA+PHN0cm9uZz4zLsvEtPPG9LavxKPKvcq+wP08L3N0cm9uZz48L3A+CjxwPjxicj4KPC9wPgo8cD48c3Ryb25nPnN0YW5kYXJkPC9zdHJvbmc+PGJyPgo8YnI+Csbk1tBzdGFuZGFyZMrHz7XNs8SsyM+1xMb0tq/Eo8q9oaM8YnI+Cjxicj4Kz8LD5s2ouf3KtcD9wLTR3cq+c3RhbmRhcmS1xNTL0NC7+tbGo7o8YnI+Cjxicj4KPHByZSBjbGFzcz0="brush:java;"> private Button btn_mode; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); text_show = (TextView) this.findViewById(R.id.text_show); text_show.setText(this.toString()); btn_mode = (Button) this.findViewById(R.id.btn_mode); } //按鈕單擊事件 public void LaunchStandard(View v){ startActivity(new Intent(this,MainActivity.class)); text_show.setText(this.toString());
初始化界面如下:

\


當點擊按鈕時,會創建新的Activity,通過TextView@後16進制數的顯示即可看出,點擊兩次分別界面如下:

\

\

此時,我們分析棧內部的運行機制:(依次從棧頂向上)

\

因此,這種Standard模式是每次都會創建新的Activity對象,當點擊返回按鈕時,他會將棧頂(當前Activity)消滅,然後跳 到下一層,例如如果現在Activity是44ed8c50,那麼當我們點擊返回時Activity會變為44f28a48,不過此時在這個 Activity中再次點擊按鈕創建對象時,它會另外創建新的Activity對象,這種模式可能大多數情況下不是我們需要的,因為對系統性能的消耗過 大。


singleTop


從上面的解釋中即可知道,在每次使用新的Activity時會自動檢測棧頂的當前Activity是否是需要引用的Activity,如果是則直接引用此Activity,而不會創建新的Activity。


我們在剛才的界面中加入一個”啟動singletop模式”按鈕,當點擊時出現我們創建的singletop中,在Activity singletop中有一個按鈕,啟動singletop模式,表示啟動當前Activity,由於我們在清單文件中配置Activity的啟動模式為 singleTop,因此此時不會再創建而是利用當前棧頂的singleTop Activity:

 


初始化界面如下:

\

當點擊”啟動singletop模式“按鈕時

\


我們分析它的運行機制,可知,當程序運行到此時,棧中的數據形式為:

\

當我們在上面界面中點擊”啟動singleTop模式”按鈕時,由於此Activity設置的啟動模式為singleTop,因此它首先會 檢測當前棧頂是否為我們要請求的Activity對象,經驗證成立,因此它不會創建新的Activity,而是引用當前棧頂的Activity。

\

雖然它不會創建新的Activity對象,不過它每次回調用onNewIntent()方法:

@Override 
     protected void onNewIntent(Intent intent) { 
        // TODO Auto-generated method stub 
        super.onNewIntent(intent); 


        Toast.makeText(this, new Date().toString(), 1).show(); 
    }

我們為此方法編寫代碼輸出當前日期,則在每次點擊上面按鈕時會輸出當前日期。


singleTask


此啟動模式和singleTop在名字上即可看出區別,即singleTop每次只檢測當前棧頂的Activity是否是我們需要請求創建的,而 singleTask則會檢測棧中全部的Activity對象,從上向下,如果檢測到是我們所請求的則會消滅此Activity對象上面的對象,直接把檢 測到的我們需要的Activity置為棧頂。

我們創建一個SingleTaskActivity,此界面中包含一個啟動MainActivity和啟動SingleTaskActivity按鈕。


初始化:

\

當點擊”啟動singletop模式“按鈕時:

\


在此界面中點擊第二個按鈕”啟動singleTask模式”按鈕,根據定義會檢測當前棧中是否有此Activity對象,因此顯示的還是當前的Activity,不會重新創建;


再點擊”啟動Standard模式”按鈕,由於MainActivity的啟動模式為standard,所以在此會重新創建一個MainActivity對象:

\


此時棧中的排列順序數據格式為:


\

當在上面界面中點擊”啟動singleTask模式”按鈕時,由於檢測到當期棧中第二個為我們要創建的Activity,會將最上面的MainActivity消滅,然後將SingleTaskActivity設置為棧頂:

-畨郕)鄷?倉镬逗'伜郗黑喎?/os/liulanqi/浏覽器工作原理類似,我們都知道在多個程序中訪問浏覽器時,如果當前浏覽器沒有打開,則打開浏覽器,否則會在當前打開的浏覽器中訪問。此模式會節省大量的系統資源,因為他能保證要請求的Activity對象在當前的棧中只存在一個。


上面即為Android中的四種啟動模式,我們在開發Android項目時會經常使用到,巧妙設置Activity的啟動模式會節省系統開銷和程序運行效率。


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved