摘要:每次啟動(dòng)一個(gè),都會(huì)創(chuàng)建一個(gè)新的實(shí)例放在棧頂。這時(shí)會(huì)移除此實(shí)例上的所有實(shí)例,使此實(shí)例置于棧頂,并復(fù)用此實(shí)例,回調(diào)方法也就是說這是一種棧內(nèi)的單例模式。這種模式一般應(yīng)用于的主頁,在退出應(yīng)用程序的時(shí)候不需要退出其他的,因?yàn)橹黜撘话阒糜跅5撞俊?/p>
launchMode簡介 what(是什么)零零碎碎的東西總是記不長久,僅僅學(xué)習(xí)別人的文章也只是他人咀嚼后留下的殘?jiān)?。無意中發(fā)現(xiàn)了這個(gè)每日一道面試題,想了想如果只是簡單地去思考,那么不僅會(huì)收效甚微,甚至難一點(diǎn)的題目自己可能都懶得去想,堅(jiān)持不下來。所以不如把每一次的思考、理解以及別人的見解記錄下來。不僅加深自己的理解,更要激勵(lì)自己堅(jiān)持下去。
是Activity的一種配置屬性,表示Activity由哪種方式啟動(dòng)
how(怎么用)有兩種配置方式:
在manifest清單文件中配置默認(rèn)啟動(dòng)屬性。
在java代碼中,啟動(dòng)Activity時(shí)指定啟動(dòng)方式,通過inent.addFlags()方法,這里面常用的有四種。
Intent.FLAG_ACTIVITY_NEW_TASK
Intent.FLAG_ACTIVITY_SINGLE_TOP
Intent.FLAG_ACTIVITY_CLEAR_TOP
Intent.FLAG_ACTIVITY_CLEAN_TASK
具體的使用以及各種搭配使用說明可以看這個(gè)Android 之Activity啟動(dòng)模式(二)之 Intent的Flag屬性,寫的很詳細(xì)。
why(為什么需要)在不同的場景考慮到不同形式的Activity實(shí)例的復(fù)用,選擇不同的加載方式。
四種launchMode啟動(dòng)模式介紹啟動(dòng)模式前,我們先來了解下Android的Activity管理機(jī)制。
Android采用Task來管理多個(gè)Activity,當(dāng)我們啟動(dòng)一個(gè)應(yīng)用時(shí),Android就會(huì)為之創(chuàng)建一個(gè)Task,然后就是啟動(dòng)這個(gè)應(yīng)用程序的入口Activity,并將實(shí)例放入Task。
Android并沒有為Task提供任何的API,我們無法真正的訪問Task,只有一個(gè)getTaskId方法獲得所在Task的Id。Task通過棧的方式管理Activity實(shí)例,包括先進(jìn)后出、入棧出棧方式都是一樣的。
standard模式
默認(rèn)的啟動(dòng)模式。每次啟動(dòng)一個(gè)Activity,都會(huì)創(chuàng)建一個(gè)新的Activity實(shí)例放在Task棧頂。這個(gè)Task棧是啟動(dòng)新的Activity的Activity所在的Task棧。那么這時(shí)候就會(huì)有特殊的情況,如果是service或者Application啟動(dòng)的Activity,并沒有Task棧,這時(shí)就需要我們通過addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)指定標(biāo)記,創(chuàng)建一個(gè)新的Task。
app的大多數(shù)Activity皆采用這種啟動(dòng)模式。作為開發(fā)者,我們考慮到的就是用戶在操作每個(gè)頁面后,即使之間有重復(fù)的界面,按回退鍵也可以按照剛剛操作的順序回退。
singleTop模式這種模式存在兩種情況:
Task棧頂不是要啟動(dòng)的Activity實(shí)例,這時(shí)和standard模式?jīng)]有區(qū)別
Task棧頂是要啟動(dòng)的Activity實(shí)例,那么就會(huì)復(fù)用這個(gè)實(shí)例,并且回調(diào)該Activity的onNewIntent方法。由于不會(huì)創(chuàng)建Activity實(shí)例,所以不會(huì)回調(diào)其他方法。
一般應(yīng)用于通知詳情頁或者聊天界面,即通過點(diǎn)擊通知欄消息進(jìn)入Activity。可以避免有多次通知消息通過點(diǎn)擊而產(chǎn)生較多Activity實(shí)例。增強(qiáng)Activity的復(fù)用性。
singleTask這種模式有三種情況。
Task棧中不存在要啟動(dòng)的Activity實(shí)例,這時(shí)和standard模式?jīng)]有任何區(qū)別
Task棧中存在要啟動(dòng)的Activity實(shí)例,且此實(shí)例在棧頂,這時(shí)和singleTop模式?jīng)]有區(qū)別
Task棧中存在要啟動(dòng)的Activity實(shí)例,且此實(shí)例不在棧頂。這時(shí)會(huì)移除此實(shí)例上的所有Activity實(shí)例,使此實(shí)例置于Task棧頂,并復(fù)用此實(shí)例,回調(diào)onNewIntent方法
也就是說這是一種棧內(nèi)的單例模式。這種模式下還可以通過manifest文件中的taskAffinity屬性來指定要加載的Task棧。
".activitys.MainActivity"
android:launchMode="singleTask"
android:taskAffinity="com.gl.task"/>
關(guān)于taskAffinity的值:每個(gè)Activity都有taskAffinity屬性,這個(gè)屬性指出了它希望進(jìn)入的Task。如果一個(gè)Activity沒有顯式的指明該Activity的taskAffinity,那么它的這個(gè)屬性就等于Application指明的taskAffinity,如果Application也沒有指明,那么該taskAffinity的值就等于包名。
這種模式一般應(yīng)用于app的主頁,在退出應(yīng)用程序的時(shí)候不需要退出其他的Activity,因?yàn)橹黜撘话阒糜赥ask棧底部?;蛘咴擁撁婵赡軙?huì)被其他應(yīng)用程序喚醒,比如瀏覽器首頁。
singleInstance模式這種模式算是一種全局的單例模式,即只要有任何一個(gè)棧存在此Activity實(shí)例,就會(huì)復(fù)用此實(shí)例,回調(diào)onNewIntent方法。如果此實(shí)例不存在,那么就會(huì)創(chuàng)建新的Task棧,并放入Activity實(shí)例。
也就是說,這種模式下的Activity實(shí)例只有兩種形式。
不存在此實(shí)例
存在此實(shí)例,且只在一個(gè)Task棧中并且該Task中只有該實(shí)例
這種模式一般應(yīng)用于鬧鐘響鈴界面、撥打接聽電話界面等系統(tǒng)界面,確保此Activity實(shí)例只能存在一個(gè)。 常應(yīng)用于獨(dú)立棧操作的應(yīng)用,如鬧鐘的提醒頁面,當(dāng)你在A應(yīng)用中看視頻時(shí),鬧鐘響了,你點(diǎn)擊鬧鐘提醒通知后進(jìn)入提醒詳情頁面,然后點(diǎn)擊返回就再次回到A的視頻頁面,這樣就不會(huì)過多干擾到用戶先前的操作了。
另外啟動(dòng)其他應(yīng)用程序中的Activity的操作,在5.0之前新啟動(dòng)的Activity實(shí)例會(huì)放入啟動(dòng)的Intent所在的Task棧內(nèi),雖然他們并不屬于同一應(yīng)用程序。這好像并不怎么合理,所以在5.0后會(huì)創(chuàng)建一個(gè)新的Task棧存放外部應(yīng)用程序的Activity實(shí)例
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/7187.html
摘要:但是如果你直接創(chuàng)建一個(gè)對象,然后重寫內(nèi)部方法,那么一定會(huì)提醒你會(huì)有內(nèi)存泄漏的可能。所以當(dāng)?shù)纳芷诮Y(jié)束后,而中還存在未處理的消息,那么上面一連串的引用關(guān)系就不允許的對象被回收,就造成了內(nèi)存泄漏。 零零碎碎的東西總是記不長久,僅僅學(xué)習(xí)別人的文章也只是他人咀嚼后留下的殘?jiān)?。無意中發(fā)現(xiàn)了這個(gè)每日一道面試題,想了想如果只是簡單地去思考,那么不僅會(huì)收效甚微,甚至難一點(diǎn)的題目自己可能都懶得去想,堅(jiān)持不下...
摘要:顯而易見的,當(dāng)這個(gè)是的時(shí),就不存在內(nèi)存泄漏的問題。這個(gè)我在第一期自定義如何有效保證內(nèi)存泄漏問題已經(jīng)說得很明白了。 零零碎碎的東西總是記不長久,僅僅學(xué)習(xí)別人的文章也只是他人咀嚼后留下的殘?jiān)?。無意中發(fā)現(xiàn)了這個(gè)每日一道面試題,想了想如果只是簡單地去思考,那么不僅會(huì)收效甚微,甚至難一點(diǎn)的題目自己可能都懶得去想,堅(jiān)持不下來。所以不如把每一次的思考、理解以及別人的見解記錄下來。不僅加深自己的理解,更要激...
摘要:與面向?qū)ο缶幊塘蠓较蛑阃黄魄岸松钠脚_(tái)期前端掘金無論我們從事何種職業(yè),在職業(yè)生涯的某個(gè)階段,都或多或少會(huì)遇到所謂的平臺(tái)期。目前為止,已經(jīng)有個(gè)用戶通過認(rèn)證登觀點(diǎn)年前端初學(xué)者的生存指南前端掘金逝者如斯夫,不舍晝夜。 你可能聽說過函數(shù)式編程(Functional programming),甚至已經(jīng)使用了一段時(shí)間。 但是,你能說清楚,它到底是什么嗎? 網(wǎng)上搜索一下,你會(huì)輕松找到好多答案...
閱讀 2181·2021-11-11 16:55
閱讀 3246·2021-10-11 10:58
閱讀 3203·2021-09-13 10:28
閱讀 4130·2021-07-26 23:57
閱讀 1138·2019-08-30 15:56
閱讀 1401·2019-08-29 13:15
閱讀 1333·2019-08-26 18:18
閱讀 1357·2019-08-26 13:44