Android Activity Launch Mode 启动模式详解
簡介
android:launchMode 屬性能設(shè)置 Activity 對象啟動時是否使用已有的實例還是多次創(chuàng)建,會使得交互設(shè)計更加良好,也能避免很多問題。
它是 Androidmanifest.xml 中 Activity 的屬性,如
四種屬性值
簡單介紹
Activity有四種啟動模式,它們是:
standard: 標準模式,也是不設(shè)置時的默認模式。每次都新建一個實例對象
singleTop: 如果在任務(wù)棧頂發(fā)現(xiàn)了相同的實例則重用,否則新建并壓入棧頂
singleTask: 如果在任務(wù)棧中發(fā)現(xiàn)了相同的實例,將其上面的實例對象終止并移除,重用該實例。否則新建實例并入棧
singleInstance :允許不同應(yīng)用,進程線程等共用一個實例,無論從何應(yīng)用調(diào)用該實例都重用
詳細介紹
standard
這是launchMode的默認值,Activity不包含android:launchMode或者顯示設(shè)置為standard的Activity就會使用這種模式。
一旦設(shè)置成這個值,每當有一次Intent請求,就會創(chuàng)建一個新的Activity實例。。結(jié)果就是這種模式會創(chuàng)建某個Activity的多個實例。
singleTop
singleTop其實和standard幾乎一樣,使用singleTop的Activity也可以創(chuàng)建很多個實例。唯一不同的就是,如果調(diào)用的目標Activity已經(jīng)位于調(diào)用者的Task的棧頂,則不創(chuàng)建新實例,而是使用當前的這個Activity實例,并調(diào)用這個實例的onNewIntent方法。
使用場景
關(guān)于singleTop一個典型的使用場景就是搜索功能。假設(shè)有一個搜索框,每次搜索查詢都會將我們引導(dǎo)至SearchActivity查看結(jié)果,為了更好的交互體驗,我們在結(jié)果頁頂部也放置這樣的搜索框。
假設(shè)一下,SearchActivity啟動模式為standard,那么每一個搜索都會創(chuàng)建一個新的SearchActivity實例,10次查詢就是10個Activity。當我們想要退回到非SearchActivity,我們需要按返回鍵10次,這顯然太不合理了。
但是如果我們使用singleTop的話,如果SearchActivity在棧頂,當有了新的查詢時,不再重新創(chuàng)建SearchAc實例,而是使用當前的SearchActivity來更新結(jié)果。當我們需要返回到非SearchActivity只需要按一次返回鍵即可。使用了singleTop顯然比之前要合理。
singleTask
singleTask這個模式和前面提到的standard和singleTop截然不同。使用singleTask啟動模式的Activity在系統(tǒng)中只會存在一個實例。如果這個實例已經(jīng)存在,intent就會通過onNewIntent傳遞到這個Activity。否則新的Activity實例被創(chuàng)建。
同一程序內(nèi)
如果系統(tǒng)中不存在singleTask Activity的實例,那么就需要創(chuàng)建這個Activity的實例,并且將這個實例放入和調(diào)用者相同的Task中并位于棧頂。如下圖
如果singleTask Activity實例已然存在,那么在Activity回退棧中,所有位于該Activity上面的Activity實例都將被銷毀掉(銷毀過程會調(diào)用Activity生命周期回調(diào)),這樣使得singleTask Activity實例位于棧頂。與此同時,Intent會通過onNewIntent傳遞到這個SingleTask Activity實例。如下圖
singleInstance
這個模式和singleTask差不多,因為他們在系統(tǒng)中都只有一份實例。唯一不同的就是存放singleInstance Activity實例的Task只能存放一個該模式的Activity實例。如果從singleInstance Activity實例啟動另一個Activity,那么這個Activity實例會放入其他的Task中。同理,如果singleInstance Activity被別的Activity啟動,它也會放入不同于調(diào)用者的Task中。
其他
Intent Flags
除了在manifest文件中設(shè)置launchMode之外,還可以在Intnet中設(shè)置flag達到同樣的效果。如下述代碼就可以讓StandardActivity已singleTop模式啟動。
Intent intent = new Intent(StandardActivity.this, StandardActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); startActivity(intent);備注
這四種模式在 Android 5.0 之前及之后、跨程序啟動可能略有不同,可自己查找資料或查看下面的原文鏈接
原文 《Understand Android Activity’s launchMode: standard, singleTop, singleTask and singleInstance》
總結(jié)
以上是生活随笔為你收集整理的Android Activity Launch Mode 启动模式详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Gson 字符串与对象相互转换工具类
- 下一篇: Android Java 代码设置 la