1:Application是什么?
android系統(tǒng)會為每個程序運行時創(chuàng)建一個Application類的對象且僅創(chuàng)建一個,所以Application可以說是單例 (singleton)模式的一個類.且application對象的生命周期是整個程序中最長的,它的生命周期就等于這個程序的生命周期。因為它是全局 的單例的,所以在不同的Activity,Service中獲得的對象都是同一個對象。所以通過Application來進行一些,數(shù)據(jù)傳遞,數(shù)據(jù)共享 等,數(shù)據(jù)緩存等操作。
2:通過Application傳遞數(shù)據(jù)
3:Application數(shù)據(jù)緩存
我一般會習(xí)慣在application中建立兩個HashMap一個用于數(shù)據(jù)的傳遞,一個用于緩 存一些數(shù)據(jù)。比如有一個Activity需要從網(wǎng)站獲取一些數(shù)據(jù),獲取完之后我們就可以把這個數(shù)據(jù)cache到Application 當中,當頁面設(shè)置到其它Activity再回來的時候,就可以直接使用緩存好的數(shù)據(jù)了。但如果需要cache一些大量的數(shù)據(jù),最好是cache一些 (軟引用)SoftReference ,并把這些數(shù)據(jù)cache到本地rom上或者sd卡上。如果在application中的緩存不存在,從本地緩存查找,如果本地緩存的數(shù)據(jù)也不存在再從網(wǎng) 絡(luò)上獲取。
4:PitFalls(漢語:易犯的錯誤)
使用Application如果保存了一些不該保存的對象很容易導(dǎo)致內(nèi)存泄漏。如果在Application的oncreate中執(zhí)行比較 耗時的操作,將直接影響的程序的啟動時間。不些清理工作不能依靠onTerminate完成,因為android會盡量讓你的程序一直運行,所以很有可能 onTerminate不會被調(diào)用。
5:MemoryLeak
在Java中內(nèi)存泄漏是只,某個(某些)對象已經(jīng)不在被使用應(yīng)該被gc所回收,但有一個對象持有這個對象的引用而阻止這個對象被回收。比如我 們通常會這樣創(chuàng)建一個View TextView tv = new TextView(this);這里的this通常都是Activity。所以這個TextView就持有著這個Activity的引用。下面看張圖 (Google IO 2011 ppt中抄得)
通常情況下,當用戶轉(zhuǎn)動手機的時候,android會重新調(diào)用OnCreate()方法生成一個新的Activity,原來的 Activity應(yīng)該被GC所回收。但如果有個對象比如一個View的作用域超過了這個Activity(比如有一個static對象或者我們把這個 View的引用放到了Application當中),這時候原來的Activity將不能被GC所回收,Activity本身又持有很多對象的引用,所以 整個Activity的內(nèi)存被泄漏了。
1.一個View的作用域超出了所在的Activity的作用域,比如一個static的View或者把一個View cache到了application當中 etc
理解:內(nèi)存:注意靜態(tài)的數(shù)據(jù)和緩存中的數(shù)據(jù);注意釋放;
2.某些與View關(guān)聯(lián)的Drawable的作用域超出了Activity的作用域。
3.Runnable對象:比如在一個Activity中啟用了一個新線程去執(zhí)行一個任務(wù),在這期間這個Activity被系統(tǒng)回收了, 但Runnalbe的 任務(wù)還沒有執(zhí)行完畢并持有Activity的引用而泄漏,但這種泄漏一般來泄漏一段時間,只有Runnalbe的線程執(zhí)行完閉,這個 Activity又可以被正常回收了。
4.內(nèi)存類的對象作用域超出Activity的范圍:比如定義了一個內(nèi)存類來存儲數(shù)據(jù),又把這個內(nèi)存類的對象傳給了其它Activity 或者Service等。因為內(nèi)部類的對象會持有當前類的引用,所以也就持有了Context的引用。解決方法是如果不需要當前的引用把內(nèi)部類寫成static或者,把內(nèi)部類抽取出來變成一個單獨的類,或者把避免內(nèi)部對象作用域超出Activity的作用域。out Of Memery Error 在android中每一個程序所分到的內(nèi)存大小是有限的,如果超過了這個數(shù)就會報Out Of Memory Error。 android給程序分配的內(nèi)存大小與手機硬件有關(guān),以下是一些手機的數(shù)據(jù):
G1:16M Droid:24 Nexus One:32M Xoom:48Ms
所以盡量把程序中的一些大的數(shù)據(jù)cache到本地文件。以免內(nèi)存使用量超標。
記得數(shù)據(jù)傳遞完成之后,把存放在application的HashMap中的數(shù)據(jù)remove掉,以免發(fā)生內(nèi)存的泄漏
6:生命周期:
onCreate 在創(chuàng)建應(yīng)用程序時創(chuàng)建
onTerminate 當終止應(yīng)用程序?qū)ο髸r調(diào)用,不保證一定被調(diào)用,當程序是被內(nèi)核終止以便為其他應(yīng)用程序釋放資源,那
么將不會提醒,并且不調(diào)用應(yīng)用程序的對象的onTerminate方法而直接終止進 程
onLowMemory 當后臺程序已經(jīng)終止資源還匱乏時會調(diào)用這個方法。好的應(yīng)用程序一般會在這個方法里面釋放一些不必
要的資源來應(yīng)付當后臺程序已經(jīng)終止,前臺應(yīng)用程序內(nèi)存還不夠時的情況。
onConfigurationChanged 配置改變時觸發(fā)這個方法
備注:application 被殺死的情況分析:
為了決定在內(nèi)存較低的時候殺掉哪個進程, Android會根據(jù)運行在這些進程內(nèi)的組件及他們的狀態(tài)把進程劃分成一個”重要程度層次”. 其重要的程度按以下規(guī)則排序:
1:前端進程可以是一個持有運行在屏幕最前端并與用戶交互的Activity的進程(onResume方法被調(diào)用時),也可以是持有一個正在運行的IntentReceiver(也就是說他正在執(zhí)行自己的onReceiveIntent方法)的進程. 在系統(tǒng)中, 只會有少數(shù)這樣的進程, 并且除非內(nèi)存已經(jīng)低到不夠這些進程運行, 否則系統(tǒng)不會主動殺掉這些進程. 這時, 設(shè)備通常已經(jīng)達到了需要內(nèi)存整理的狀態(tài), 所以殺掉這些進程是為了不讓用戶界面停止響應(yīng).
2:可視進程是持有一個被用戶可見, 但沒有顯示在最前端 (onPause方法被調(diào)用時) 的Activity的進程. 舉例來說, 這種進程通常出現(xiàn)在一個前端Activity以一個對話框出現(xiàn)并保持前一個Activity可見時. 這種進程被系統(tǒng)認為是極其重要的, 并且通常不會被殺掉, 除非為了保持所有前端進程正常運行不得不殺掉這些可見進程.
3:服務(wù)進程是持有一個Service的進程, 該Service是由startService()方法啟動的, 盡管這些進程用戶不能直接看到, 但是通常他們做的工作用戶是十分關(guān)注的(例如, 在后臺播放mp3或是在后臺下載 上傳文件), 所以, 除非為了保持所有的前端進程和可視進程正常運行外, 系統(tǒng)是不會殺掉服務(wù)進程的.
4:后臺進程是持有一個不再被用戶可見的Activity(onStop()方法被調(diào)用時)的進程. 這些進程不會直接影響用戶體驗. 加入這些進程已經(jīng)完整的,正確的完成了自己的生命周期(訪問Activity查看更多細節(jié)), 系統(tǒng)會在為前三種進程釋放內(nèi)存時隨時殺掉這些后臺進程. 通常會有很多的后臺進程在運行, 所以這些進程被存放在一個LRU列表中, 以保證在低內(nèi)存的時候, 最近一個被用戶看到的進程會被最后殺掉.
5:空進程是沒有持有任何活動應(yīng)用組件的進程. 保留這種進程的唯一理由是為了提供一種緩存機制, 縮短他的應(yīng)用下次運行時的啟動時間. 就其本身而言, 系統(tǒng)殺掉這些進程的目的是為了在這些空進程和底層的核心緩存之間平衡整個系統(tǒng)的資源. www.2cto.com
當需要給一個進程分類的時候, 系統(tǒng)會在該進程中處于活動狀態(tài)的所有組件里掉選一個重要等級最高作為分類依據(jù). 查看Activity, Service,和IntentReceiver的文檔, 了解每個組件在進程整個生命周期中的貢獻. 每一個classes的文檔詳細描述他們在各自應(yīng)用的生命周期中所起得作用.
# 7:application 的context #
1、它描述的是一個應(yīng)用程序環(huán)境的信息,即上下文。
2、該類是一個抽象(abstract class)類,Android提供了該抽象類的具體實現(xiàn)類(后面我們會講到是ContextIml類)。
3、通過它我們可以獲取應(yīng)用程序的資源和類,也包括一些應(yīng)用級別操作,例如:啟動一個Activity,發(fā)送廣播,接受Intent
信息 等。。