其實這是很簡單的一個問題。但是這還是要對android中activity的啟動模式有相當的了解才行,當點選home鍵的時候,懂android的人都知道,他會把目前activity放到後退棧中,
棧(stack)又稱堆棧,它是一種運算受限的線性表,其限制是僅允許在表的一端進行插入和删除運算。人們把此端稱為棧頂,棧頂的第一個元素被稱為棧頂元素,相對地,把另一端稱為棧底。向一個棧插入新元素又稱為進棧或入棧,它是把該元素放到棧頂元素的上面,使之成為新的棧頂元素;從一個棧删除元素又稱為出棧或退棧,它是把棧頂元素删除掉,使其下面的相鄰元素成為新的棧頂元素。
那麼我們知道,目前activity一定在棧頂,那麼你讓activity的啟動模式為singletop的話就會在你再次進入麼有關閉的程式的話,那麼就會調用棧頂的activity進行顯示,也就不會出現調用别的頁面的情況。
順便再普及下android啟動模式:
在android中每個界面都是一個activity,切換界面操作其實是多個不同activity之間的執行個體化操作。在android中activity的啟動模式決定了activity的啟動運作方式。
android總activity的啟動模式分為四種:
activity啟動模式設定:
<activity android:name=".mainactivity" android:launchmode="standard" />
activity的四種啟動模式:
1. standard
模式啟動模式,每次激活activity時都會建立activity,并放入任務棧中。
2. singletop
如果在任務的棧頂正好存在該activity的執行個體, 就重用該執行個體,否者就會建立新的執行個體并放入棧頂(即使棧中已經存在該activity執行個體,隻要不在棧頂,都會建立執行個體)。
3. singletask
如果在棧中已經有該activity的執行個體,就重用該執行個體(會調用執行個體的onnewintent())。重用時,會讓該執行個體回到棧頂,是以在它上面的執行個體将會被移除棧。如果棧中不存在該執行個體,将會建立新的執行個體放入棧中。
4. singleinstance
在一個新棧中建立該activity執行個體,并讓多個應用共享改棧中的該activity執行個體。一旦改模式的activity的執行個體存在于某個棧中,任何應用再激活改activity時都會重用該棧中的執行個體,其效果相當于多個應用程式共享一個應用,不管誰激活該activity都會進入同一個應用中。
其中standard是系統預設的啟動模式。
下面通過執行個體來示範standard的運作機制:
private textview text_show;
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));
初始化界面如下:
當點選按鈕時,會建立新的activity,通過textview@後16進制數的顯示即可看出,點選兩次分别界面如下:
此時,我們分析棧内部的運作機制:(依次從棧頂向上)
是以,這種standard模式是每次都會建立新的activity對象,當點選傳回按鈕時,他會将棧頂(目前activity)消滅,然後跳 到下一層,例如如果現在activity是44ed8c50,那麼當我們點選傳回時activity會變為44f28a48,不過此時在這個 activity中再次點選按鈕建立對象時,它會另外建立新的activity對象,這種模式可能大多數情況下不是我們需要的,因為對系統性能的消耗過 大。
下面我們介紹兩種能使用目前棧中activity的啟動模式:
從上面的解釋中即可知道,在每次使用新的activity時會自動檢測棧頂的目前activity是否是需要引用的activity,如果是則直接引用此activity,而不會建立新的activity。
我們在剛才的界面中加入一個"啟動singletop模式"按鈕,當點選時出現我們建立的singletop中,在activity singletop中有一個按鈕,啟動singletop模式,表示啟動目前activity,由于我們在清單檔案中配置activity的啟動模式為 singletop,是以此時不會再建立而是利用目前棧頂的singletop activity:
<activity
android:name=".singletopactivity"
android:label="@string/singletop"
android:launchmode="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();
}
我們為此方法編寫代碼輸出目前日期,則在每次點選上面按鈕時會輸出目前日期。
此啟動模式和singletop在名字上即可看出差別,即singletop每次隻檢測目前棧頂的activity是否是我們需要請求建立的,而 singletask則會檢測棧中全部的activity對象,從上向下,如果檢測到是我們所請求的則會消滅此activity對象上面的對象,直接把檢 測到的我們需要的activity置為棧頂。
我們建立一個singletaskactivity,此界面中包含一個啟動mainactivity和啟動singletaskactivity按鈕。
初始化:
點選"啟動singletask模式"按鈕:
在此界面中點選第二個按鈕"啟動singletask模式"按鈕,根據定義會檢測目前棧中是否有此activity對象,是以顯示的還是目前的activity,不會重新建立;
再點選"啟動standard模式"按鈕,由于mainactivity的啟動模式為standard,是以在此會重新建立一個mainactivity對象:
此時棧中資料格式為:
當在上面界面中點選"啟動singletask模式"按鈕時,由于檢測到當期棧中第二個為我們要建立的activity,會将最上面的mainactivity消滅,然後将singletaskactivity設定為棧頂:
此啟動模式和我們使用的浏覽器工作原理類似,我們都知道在多個程式中通路浏覽器時,如果目前浏覽器沒有打開,則打開浏覽器,否則會在目前打開的浏覽器中通路。此模式會節省大量的系統資源,因為他能保證要請求的activity對象在目前的棧中隻存在一個。
上面即為android中的四種啟動模式,我們在開發android項目時會經常使用到,巧妙設定activity的啟動模式會節省系統開銷和程式運作效率。