Android Application類的詳細(xì)介紹
Android Application類詳解:
Android中Application類的詳細(xì)解釋:
我們?cè)谄綍r(shí)的開發(fā)中,有時(shí)候可能會(huì)需要一些全局?jǐn)?shù)據(jù),來(lái)讓應(yīng)用中的所有Activity和View都能訪問(wèn)到,大家在遇到這種情況時(shí),可能首先會(huì)想到自己定義一個(gè)類,然后創(chuàng)建很多靜態(tài)成員。
但是這種方法不符合Android的框架架構(gòu),不過(guò)andorid已經(jīng)為我們提供了這種情況的解決方案:在Android中,有一個(gè)名為Application的類,我們可以在Activity中使用getApplication(),方法來(lái)獲得,它是代表我們的應(yīng)用程序的類,使用它可以獲得當(dāng)前應(yīng)用的主題,資源文件中的內(nèi)容等,這個(gè)類更靈活的一個(gè)特性就是可以被我們繼承,來(lái)添加我們自己的全局屬性。讓整個(gè)App的Activity和View都能訪問(wèn)到。
1.概念:
android系統(tǒng)會(huì)為每個(gè)程序運(yùn)行時(shí)創(chuàng)建一個(gè)Application類的對(duì)象且僅創(chuàng)建一個(gè),所以Application可以說(shuō)是單例 (singleton)模式的一個(gè)類.且application對(duì)象的生命周期是整個(gè)程序中最長(zhǎng)的,它的生命周期就等于這個(gè)程序的生命周期。因?yàn)樗侨值膯卫?,所以在不同的Activity,Service中獲得的對(duì)象都是同一個(gè)對(duì)象。所以通過(guò)Application來(lái)進(jìn)行一些,數(shù)據(jù)傳遞,數(shù)據(jù)共享,數(shù)據(jù)緩存等操作。
2.作用:
(1).Application是一個(gè)基類,這個(gè)基類的作用是獲取整個(gè)App的狀態(tài),我們需要自己定義一個(gè)類來(lái)繼承這個(gè)基類。
(2).定義一些全局的和一些上下文都要用到的變量和方法。
3.優(yōu)點(diǎn):
(1).繼承的方式:
生命周期隨著應(yīng)用程序的銷毀而銷毀。
(2).靜態(tài)類或靜態(tài)方法:
程序退出后該類或者變量不能立刻被GC回收。
當(dāng)你再次進(jìn)入后會(huì)發(fā)現(xiàn)該靜態(tài)類保存的信息狀態(tài)是之前的。有可能會(huì)導(dǎo)致程序不是你想要的初始化狀態(tài)。
(3).App的進(jìn)程被創(chuàng)建時(shí),這個(gè)類就會(huì)被實(shí)例化,onCreate()方法就會(huì)被執(zhí)行,給所有全局變量賦初期值。這樣,所有的Activity就共同擁有這個(gè)類里面的變量了。
4.getContext()、getApplication()、getApplicationContext()、getActivity()的區(qū)別:
(1).getContext():獲取到當(dāng)前對(duì)象的上下文。
(2).getApplication():獲得Application的對(duì)象
(3).getApplicationContext():獲得應(yīng)用程序的上下文。有且僅有一個(gè)相同的對(duì)象。生命周期隨著應(yīng)用程序的摧毀而銷毀。就像是社會(huì),所有的都發(fā)生在這個(gè)社會(huì)上,僅且只有一個(gè)社會(huì)。每個(gè)Activity都有自己的上下文,而整個(gè)應(yīng)用只有一個(gè)上下文
(4)getActivity():獲得Fragment依附的Activity對(duì)象。Fragment里邊的getActivity()不推薦使用原因如下:這個(gè)方法會(huì)返回當(dāng)前Fragment所附加的Activity,當(dāng)Fragment生命周期結(jié)束并銷毀時(shí),getActivity()返回的是null,所以在使用時(shí)要注意判斷null或者捕獲空指針異常。所以只要判斷getActivity()為空,就可以不再執(zhí)行下面的代碼,這完全不影響業(yè)務(wù)的使用。
5.應(yīng)用程序創(chuàng)建Context實(shí)例的情況有如下幾種情況:
(1).創(chuàng)建Application對(duì)象時(shí),而且整個(gè)App共一個(gè)Application對(duì)象
(2).創(chuàng)建Service對(duì)象時(shí)
(3).創(chuàng)建Activity對(duì)象時(shí)。
Activity Service Application都是Context的子類。Context是一個(gè)抽象類,具體的實(shí)現(xiàn)是在ContextImpl類中。因此應(yīng)用程序App共有的Context數(shù)目公式為:
總Context實(shí)例個(gè)數(shù)=Service個(gè)數(shù)+Activity個(gè)數(shù)+1(Application對(duì)應(yīng)的Context實(shí)例)
6.Android應(yīng)用中內(nèi)存泄漏問(wèn)題:
(1).對(duì)Context持有一個(gè)過(guò)長(zhǎng)的引用。對(duì)Context的引用超過(guò)它本身的生命周期。Android應(yīng)用程序限制使用的堆內(nèi)存是16M
(2).靜態(tài)變量擁有了更多的對(duì)象引用,內(nèi)存仍然不會(huì)被銷毀。
總結(jié)一下:避免Context泄漏應(yīng)該注意的問(wèn)題:
1.使用Application這種Context類型
2.注意對(duì)Context的引用不要超過(guò)它本身的生命周期
3.謹(jǐn)慎使用static關(guān)鍵字
4.Context里如果有線程,一定要在onDestory()里及時(shí)停掉。
感謝閱讀,希望能幫助到大家謝謝大家對(duì)本站的支持!
相關(guān)文章
Android自定義手機(jī)界面狀態(tài)欄實(shí)例代碼
我們知道IOS上的應(yīng)用,狀態(tài)欄的顏色總能與應(yīng)用標(biāo)題欄顏色保持一致,用戶體驗(yàn)很不錯(cuò),那安卓是否可以呢?若是在安卓4.4之前,答案是否定的,但在4.4之后,谷歌允許開發(fā)者自定義狀態(tài)欄背景顏色啦,這是個(gè)不錯(cuò)的體驗(yàn)2017-03-03Android中實(shí)現(xiàn)長(zhǎng)按照片彈出右鍵菜單功能的實(shí)例代碼
這篇文章主要介紹了Android中實(shí)現(xiàn)長(zhǎng)按照片彈出右鍵菜單功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01Android實(shí)現(xiàn)三段式滑動(dòng)效果
最近發(fā)現(xiàn)很多app都使用了三段式滑動(dòng),比如說(shuō)高德的首頁(yè)和某寶等物流信息都是使用的三段式滑動(dòng)方式,谷歌其實(shí)給了我們很好的2段式滑動(dòng),就是BottomSheet,所以這次我也是在這個(gè)原理基礎(chǔ)上做了一個(gè)小小的修改來(lái)實(shí)現(xiàn)我們今天想要的效果。2021-06-06Android實(shí)現(xiàn)簡(jiǎn)易計(jì)步器功能隔天步數(shù)清零查看歷史運(yùn)動(dòng)紀(jì)錄
這篇文章主要介紹了Android實(shí)現(xiàn)簡(jiǎn)易計(jì)步器功能隔天步數(shù)清零查看歷史運(yùn)動(dòng)紀(jì)錄,需要的朋友可以參考下2017-06-06Android?配合Mat工具監(jiān)聽查找內(nèi)存泄漏的操作方法
這篇文章主要介紹了Android?配合Mat工具監(jiān)聽查找內(nèi)存泄漏問(wèn)題,使用Android Studio Profiler查看內(nèi)存的操作,本文通過(guò)圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05Flutter事件監(jiān)聽與EventBus事件的應(yīng)用詳解
EventBus的核心是基于Streams。它允許偵聽器訂閱事件并允許發(fā)布者觸發(fā)事件,使得不同組件的數(shù)據(jù)不需要一層層傳遞,可以直接通過(guò)EventBus實(shí)現(xiàn)跨組件通訊2023-04-04利用Kotlin Tools如何快速添加Kotlin依賴詳解
這篇文章主要給大家介紹了關(guān)于利用Kotlin Tools如何快速添加Kotlin依賴的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-11-11flutter RotationTransition實(shí)現(xiàn)旋轉(zhuǎn)動(dòng)畫
這篇文章主要為大家詳細(xì)介紹了flutter RotationTransition實(shí)現(xiàn)旋轉(zhuǎn)動(dòng)畫,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07android實(shí)現(xiàn)狀態(tài)欄添加圖標(biāo)的函數(shù)實(shí)例
這篇文章主要介紹了android實(shí)現(xiàn)狀態(tài)欄添加圖標(biāo)的函數(shù),較為詳細(xì)的分析了Android狀態(tài)欄添加及刪除圖標(biāo)的具體實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10