国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

每日一道面試題(第4期)---launchMode的應用場景

xeblog / 1520人閱讀

摘要:每次啟動一個,都會創建一個新的實例放在棧頂。這時會移除此實例上的所有實例,使此實例置于棧頂,并復用此實例,回調方法也就是說這是一種棧內的單例模式。這種模式一般應用于的主頁,在退出應用程序的時候不需要退出其他的,因為主頁一般置于棧底部。

零零碎碎的東西總是記不長久,僅僅學習別人的文章也只是他人咀嚼后留下的殘渣。無意中發現了這個每日一道面試題,想了想如果只是簡單地去思考,那么不僅會收效甚微,甚至難一點的題目自己可能都懶得去想,堅持不下來。所以不如把每一次的思考、理解以及別人的見解記錄下來。不僅加深自己的理解,更要激勵自己堅持下去。

launchMode簡介 what(是什么)

是Activity的一種配置屬性,表示Activity由哪種方式啟動

how(怎么用)

有兩種配置方式:

在manifest清單文件中配置默認啟動屬性。

在java代碼中,啟動Activity時指定啟動方式,通過inent.addFlags()方法,這里面常用的有四種。

Intent.FLAG_ACTIVITY_NEW_TASK

Intent.FLAG_ACTIVITY_SINGLE_TOP

Intent.FLAG_ACTIVITY_CLEAR_TOP

Intent.FLAG_ACTIVITY_CLEAN_TASK

具體的使用以及各種搭配使用說明可以看這個Android 之Activity啟動模式(二)之 Intent的Flag屬性,寫的很詳細。

why(為什么需要)

在不同的場景考慮到不同形式的Activity實例的復用,選擇不同的加載方式。

四種launchMode啟動模式

介紹啟動模式前,我們先來了解下Android的Activity管理機制。

Android采用Task來管理多個Activity,當我們啟動一個應用時,Android就會為之創建一個Task,然后就是啟動這個應用程序的入口Activity,并將實例放入Task。

Android并沒有為Task提供任何的API,我們無法真正的訪問Task,只有一個getTaskId方法獲得所在Task的Id。Task通過棧的方式管理Activity實例,包括先進后出、入棧出棧方式都是一樣的。

standard模式

默認的啟動模式。每次啟動一個Activity,都會創建一個新的Activity實例放在Task棧頂。這個Task棧是啟動新的Activity的Activity所在的Task棧。那么這時候就會有特殊的情況,如果是service或者Application啟動的Activity,并沒有Task棧,這時就需要我們通過addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)指定標記,創建一個新的Task。

app的大多數Activity皆采用這種啟動模式。作為開發者,我們考慮到的就是用戶在操作每個頁面后,即使之間有重復的界面,按回退鍵也可以按照剛剛操作的順序回退。

singleTop模式

這種模式存在兩種情況:

Task棧頂不是要啟動的Activity實例,這時和standard模式沒有區別

Task棧頂是要啟動的Activity實例,那么就會復用這個實例,并且回調該Activity的onNewIntent方法。由于不會創建Activity實例,所以不會回調其他方法。

一般應用于通知詳情頁或者聊天界面,即通過點擊通知欄消息進入Activity。可以避免有多次通知消息通過點擊而產生較多Activity實例。增強Activity的復用性。

singleTask

這種模式有三種情況。

Task棧中不存在要啟動的Activity實例,這時和standard模式沒有任何區別

Task棧中存在要啟動的Activity實例,且此實例在棧頂,這時和singleTop模式沒有區別

Task棧中存在要啟動的Activity實例,且此實例不在棧頂。這時會移除此實例上的所有Activity實例,使此實例置于Task棧頂,并復用此實例,回調onNewIntent方法

也就是說這是一種棧內的單例模式。這種模式下還可以通過manifest文件中的taskAffinity屬性來指定要加載的Task棧。

".activitys.MainActivity"
    android:launchMode="singleTask"
    android:taskAffinity="com.gl.task"/>

關于taskAffinity的值:每個Activity都有taskAffinity屬性,這個屬性指出了它希望進入的Task。如果一個Activity沒有顯式的指明該Activity的taskAffinity,那么它的這個屬性就等于Application指明的taskAffinity,如果Application也沒有指明,那么該taskAffinity的值就等于包名。

這種模式一般應用于app的主頁,在退出應用程序的時候不需要退出其他的Activity,因為主頁一般置于Task棧底部。或者該頁面可能會被其他應用程序喚醒,比如瀏覽器首頁。

singleInstance模式

這種模式算是一種全局的單例模式,即只要有任何一個棧存在此Activity實例,就會復用此實例,回調onNewIntent方法。如果此實例不存在,那么就會創建新的Task棧,并放入Activity實例。

也就是說,這種模式下的Activity實例只有兩種形式。

不存在此實例

存在此實例,且只在一個Task棧中并且該Task中只有該實例

這種模式一般應用于鬧鐘響鈴界面、撥打接聽電話界面等系統界面,確保此Activity實例只能存在一個。 常應用于獨立棧操作的應用,如鬧鐘的提醒頁面,當你在A應用中看視頻時,鬧鐘響了,你點擊鬧鐘提醒通知后進入提醒詳情頁面,然后點擊返回就再次回到A的視頻頁面,這樣就不會過多干擾到用戶先前的操作了。

另外啟動其他應用程序中的Activity的操作,在5.0之前新啟動的Activity實例會放入啟動的Intent所在的Task棧內,雖然他們并不屬于同一應用程序。這好像并不怎么合理,所以在5.0后會創建一個新的Task棧存放外部應用程序的Activity實例

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/7187.html

相關文章

  • 每日一道面試1)---自定義handler如何有效保證內存泄漏問

    摘要:但是如果你直接創建一個對象,然后重寫內部方法,那么一定會提醒你會有內存泄漏的可能。所以當的生命周期結束后,而中還存在未處理的消息,那么上面一連串的引用關系就不允許的對象被回收,就造成了內存泄漏。 零零碎碎的東西總是記不長久,僅僅學習別人的文章也只是他人咀嚼后留下的殘渣。無意中發現了這個每日一道面試題,想了想如果只是簡單地去思考,那么不僅會收效甚微,甚至難一點的題目自己可能都懶得去想,堅持不下...

    番茄西紅柿 評論0 收藏0
  • 每日一道面試)---一般什么情況下會導致內存泄漏問

    摘要:顯而易見的,當這個是的時,就不存在內存泄漏的問題。這個我在第一期自定義如何有效保證內存泄漏問題已經說得很明白了。 零零碎碎的東西總是記不長久,僅僅學習別人的文章也只是他人咀嚼后留下的殘渣。無意中發現了這個每日一道面試題,想了想如果只是簡單地去思考,那么不僅會收效甚微,甚至難一點的題目自己可能都懶得去想,堅持不下來。所以不如把每一次的思考、理解以及別人的見解記錄下來。不僅加深自己的理解,更要激...

    番茄西紅柿 評論0 收藏0
  • 實用性前端知識 - 收藏集 - 掘金

    摘要:與面向對象編程六大方向助你突破前端生涯平臺期前端掘金無論我們從事何種職業,在職業生涯的某個階段,都或多或少會遇到所謂的平臺期。目前為止,已經有個用戶通過認證登觀點年前端初學者的生存指南前端掘金逝者如斯夫,不舍晝夜。 你可能聽說過函數式編程(Functional programming),甚至已經使用了一段時間。 但是,你能說清楚,它到底是什么嗎? 網上搜索一下,你會輕松找到好多答案...

    Honwhy 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<