android-application學(xué)習(xí)

  • 介紹:

Application是單例模式的類柏腻,android系統(tǒng)為每個(gè)應(yīng)用程序創(chuàng)建一個(gè)Application類的對(duì)象且只創(chuàng)建一個(gè)泉粉。
啟動(dòng)Application時(shí),系統(tǒng)會(huì)創(chuàng)建一個(gè)PID灵莲,即進(jìn)程ID路克,所有的Activity都會(huì)在此進(jìn)程上運(yùn)行
Application創(chuàng)建的時(shí)候初始化全局變量琼开,同一個(gè)應(yīng)用的所有Activity都可以取到這些全局變量的值
Application對(duì)象的生命周期是整個(gè)程序中最長(zhǎng)的易结,它的生命周期就等于這個(gè)程序的生命周期
Application全局的單例的,所以在不同的Activity,Service中獲得的對(duì)象都是同一個(gè)對(duì)象

  • 應(yīng)用領(lǐng)域:數(shù)據(jù)傳遞柜候、數(shù)據(jù)共享和數(shù)據(jù)緩存等操作搞动。

    • 復(fù)雜數(shù)據(jù)的傳遞:
      • Activity A, 跳轉(zhuǎn)到 Activity B,用Intent.putExtra() 或者Bundle進(jìn)行傳遞數(shù)據(jù)渣刷,但是:Intent和Bundle所能攜帶的數(shù)據(jù)類型都是一些基本的數(shù)據(jù)類型鹦肿,想實(shí)現(xiàn)復(fù)雜的數(shù)據(jù)傳遞就比較麻煩了,通常需要實(shí)現(xiàn) Serializable或者Parcellable接口
      • Application進(jìn)行解決:(思路)
        Application中創(chuàng)建一個(gè)HashMap 辅柴,以字符串為索引箩溃,Object為value這樣我們的HashMap就可以存儲(chǔ)任何類型的對(duì)象了。在Activity A中把需要傳遞的對(duì)象放入這個(gè)HashMap碌嘀,然后通過(guò)Intent或者其它途經(jīng)再把這索引的字符串傳遞給Activity B ,Activity B 就可以根據(jù)這個(gè)字符串HashMap中取出這個(gè)對(duì)象了涣旨。只要再向下轉(zhuǎn)個(gè)型 ,就實(shí)現(xiàn)了對(duì)象的傳遞股冗。
  • 生命周期

    • onCreate 在創(chuàng)建應(yīng)用程序時(shí)創(chuàng)建
    • onTerminate 當(dāng)終止應(yīng)用程序?qū)ο髸r(shí)調(diào)用霹陡,不保證一定被調(diào)用,當(dāng)程序是被內(nèi)核終止以便為其他應(yīng)用程序釋放資源魁瞪,那么將不會(huì)提醒穆律,并且不調(diào)用應(yīng)用程序的對(duì)象的onTerminate方法而直接終止進(jìn) 程
    • onLowMemory 當(dāng)后臺(tái)程序已經(jīng)終止資源還匱乏時(shí)會(huì)調(diào)用這個(gè)方法好的應(yīng)用程序一般會(huì)在這個(gè)方法里面釋放一些不必要的資源來(lái)應(yīng)付當(dāng)后臺(tái)程序已經(jīng)終止导俘,前臺(tái)應(yīng)用程序內(nèi)存還不夠時(shí)的情況峦耘。onConfigurationChanged 配置改變時(shí)觸發(fā)這個(gè)方法
    • 備注:
      application 被殺死的情況分析:(Application的生命周期代表這個(gè)應(yīng)用的生命周期
      為了決定在內(nèi)存較低的時(shí)候殺掉哪個(gè)進(jìn)程, Android會(huì)根據(jù)運(yùn)行在這些進(jìn)程內(nèi)的組件及他們的狀態(tài)把進(jìn)程劃分成一個(gè)”重要程度層次”. 其重要的程度按以下規(guī)則排序:
      • 1:前端進(jìn)程可以是一個(gè)持有運(yùn)行在屏幕最前端并與用戶交互的Activity的進(jìn)程(onResume方法被調(diào)用時(shí)),也可以是持有一個(gè)正在運(yùn)行的IntentReceiver(也就是說(shuō)他正在執(zhí)行自己的onReceiveIntent方法)的進(jìn)程. 在系統(tǒng)中, 只會(huì)有少數(shù)這樣的進(jìn)程, 并且除非內(nèi)存已經(jīng)低到不夠這些進(jìn)程運(yùn)行, 否則系統(tǒng)不會(huì)主動(dòng)殺掉這些進(jìn)程. 這時(shí), 設(shè)備通常已經(jīng)達(dá)到了需要內(nèi)存整理的狀態(tài), 所以殺掉這些進(jìn)程是為了不讓用戶界面停止響應(yīng).
      • 2:可視進(jìn)程是持有一個(gè)被用戶可見(jiàn), 但沒(méi)有顯示在最前端 (onPause方法被調(diào)用時(shí)) 的Activity的進(jìn)程. 舉例來(lái)說(shuō), 這種進(jìn)程通常出現(xiàn)在一個(gè)前端Activity以一個(gè)對(duì)話框出現(xiàn)并保持前一個(gè)Activity可見(jiàn)時(shí). 這種進(jìn)程被系統(tǒng)認(rèn)為是極其重要的, 并且通常不會(huì)被殺掉, 除非為了保持所有前端進(jìn)程正常運(yùn)行不得不殺掉這些可見(jiàn)進(jìn)程.
      • 3:服務(wù)進(jìn)程是持有一個(gè)Service的進(jìn)程, 該Service是由startService()方法啟動(dòng)的, 盡管這些進(jìn)程用戶不能直接看到, 但是通常他們做的工作用戶是十分關(guān)注的(例如, 在后臺(tái)播放mp3或是在后臺(tái)下載 上傳文件), 所以, 除非為了保持所有的前端進(jìn)程和可視進(jìn)程正常運(yùn)行外, 系統(tǒng)是不會(huì)殺掉服務(wù)進(jìn)程的.
      • 4:后臺(tái)進(jìn)程是持有一個(gè)不再被用戶可見(jiàn)的Activity(onStop()方法被調(diào)用時(shí))的進(jìn)程. 這些進(jìn)程不會(huì)直接影響用戶體驗(yàn). 加入這些進(jìn)程已經(jīng)完整的,正確的完成了自己的生命周期(訪問(wèn)Activity查看更多細(xì)節(jié)), 系統(tǒng)會(huì)在為前三種進(jìn)程釋放內(nèi)存時(shí)隨時(shí)殺掉這些后臺(tái)進(jìn)程. 通常會(huì)有很多的后臺(tái)進(jìn)程在運(yùn)行, 所以這些進(jìn)程被存放在一個(gè)LRU列表中, 以保證在低內(nèi)存的時(shí)候, 最近一個(gè)被用戶看到的進(jìn)程會(huì)被最后殺掉.
      • 5:空進(jìn)程是沒(méi)有持有任何活動(dòng)應(yīng)用組件的進(jìn)程. 保留這種進(jìn)程的唯一理由是為了提供一種緩存機(jī)制, 縮短他的應(yīng)用下次運(yùn)行時(shí)的啟動(dòng)時(shí)間. 就其本身而言, 系統(tǒng)殺掉這些進(jìn)程的目的是為了在這些空進(jìn)程和底層的核心緩存之間平衡整個(gè)系統(tǒng)的資源. 來(lái)自:www.2cto.com
      • 當(dāng)需要給一個(gè)進(jìn)程分類的時(shí)候, 系統(tǒng)會(huì)在該進(jìn)程中處于活動(dòng)狀態(tài)的所有組件里掉選一個(gè)重要等級(jí)最高作為分類依據(jù). 查看Activity, Service,和IntentReceiver的文檔, 了解每個(gè)組件在進(jìn)程整個(gè)生命周期中的貢獻(xiàn). 每一個(gè)classes的文檔詳細(xì)描述他們?cè)?strong>各自應(yīng)用的生命周期中所起得作用.

實(shí)現(xiàn)步驟:

1.繼承Application

        public class CustomApplication extends Application{
            @Override
            public void onCreate(){}
        }

繼承Application類旅薄,主要重寫里面的onCreate()方法(android.app.Application包的onCreate()才是真正的Android程序的入口點(diǎn))
2.在AndroidManifest.xml文件中配置自定義的Application

        <application
                android:name="CustomApplication">
        </application>
  1. 如何獲得Application的信息(全局變量)呢辅髓?

           public class FirstActivity extends Activity{
               private CustomApplication app;
               @Override
               public void onCreate(Bundle savedInstanceState){
                   .....
                   app = (CustomApplication) getApplication(); // 獲得CustomApplication對(duì)象
                   Log.i("FirstActivity", "初始值=====" + app.getValue()); // 獲取進(jìn)程中的全局變量值泣崩,看是否是初始化值
                   app.setValue("Harvey Ren"); // 重新設(shè)置值
                   Log.i("FirstActivity", "修改后=====" + app.getValue()); // 再次獲取進(jìn)程中的全局變量值,看是否被修改
               }
           }
    

只需要調(diào)用ContextgetApplicationContext或者Activity的getApplication方法來(lái)獲得一個(gè)Application對(duì)象洛口,然后再得到相應(yīng)的成員變量即可矫付。

  • 知識(shí)延伸:

MemoryLeak
在Java中內(nèi)存泄漏是指:某個(gè)(某些)對(duì)象已經(jīng)不在被使用應(yīng)該被gc所回收,但有一個(gè)對(duì)象持有這個(gè)對(duì)象的引用而阻止這個(gè)對(duì)象被回收第焰。比如我們通常會(huì)這樣創(chuàng)建一個(gè)View TextView tv = new TextView(this);這里的this通常都是Activity买优。所以這個(gè)TextView就持有著這個(gè)Activity的引用
通常情況下挺举,當(dāng)用戶轉(zhuǎn)動(dòng)手機(jī)的時(shí)候杀赢,android會(huì)重新調(diào)用OnCreate()方法生成一個(gè)新的Activity,原來(lái)的 Activity應(yīng)該被GC所回收湘纵。但如果有個(gè)對(duì)象比如一個(gè)View的作用域超過(guò)了這個(gè)Activity(比如有一個(gè)static對(duì)象或者我們把這個(gè) View的引用放到了Application當(dāng)中)脂崔,這時(shí)候原來(lái)的Activity將不能被GC所回收Activity本身又持有很多對(duì)象的引用梧喷,所以 整個(gè)Activity的內(nèi)存被泄漏了砌左。

備注:經(jīng)常導(dǎo)致內(nèi)存泄漏核心原因:
keeping a long-lived reference to a Context.持有一個(gè)context的對(duì)象,從而gc不能回收铺敌。

- 1.**一個(gè)View的作用域超出了所在的Activity的作用域**汇歹,比如一個(gè)static的View或者把一個(gè)View cache到了application當(dāng)中 etc

理解:內(nèi)存:注意靜態(tài)的數(shù)據(jù)和緩存中的數(shù)據(jù);注意釋放适刀;
- 2.某些與View關(guān)聯(lián)的Drawable的作用域超出了Activity的作用域秤朗。
- 3.Runnable對(duì)象:比如在一個(gè)Activity中啟用了一個(gè)新線程去執(zhí)行一個(gè)任務(wù),在這期間這個(gè)Activity被系統(tǒng)回收了笔喉, 但Runnalbe的 任務(wù)還沒(méi)有執(zhí)行完畢并持有Activity的引用而泄漏但這種泄漏一般來(lái)泄漏一段時(shí)間硝皂,只有Runnalbe的線程執(zhí)行完閉常挚,這個(gè) Activity又可以被正常回收了稽物。
- 4.內(nèi)存類的對(duì)象作用域超出Activity的范圍:比如定義了一個(gè)內(nèi)存類來(lái)存儲(chǔ)數(shù)據(jù)奄毡,又把這個(gè)內(nèi)存類的對(duì)象傳給了其它Activity 或者Service等。因?yàn)閮?nèi)部類的對(duì)象會(huì)持有當(dāng)前類的引用贝或,所以也就持有了Context的引用吼过。解決方法是如果不需要當(dāng)前的引用把內(nèi)部類寫成static或者,把內(nèi)部類抽取出來(lái)變成一個(gè)單獨(dú)的類咪奖,或者把避免內(nèi)部對(duì)象作用域超出Activity的作用域盗忱。
out Of Memery Error 在android中每一個(gè)程序所分到的內(nèi)存大小是有限的,如果超過(guò)了這個(gè)數(shù)就會(huì)報(bào)Out Of Memory Error羊赵。
- 注意:所以盡量把程序中的一些大的數(shù)據(jù)cache到本地文件趟佃。以免內(nèi)存使用量超標(biāo)。記得數(shù)據(jù)傳遞完成之后,把存放在application的HashMap中的數(shù)據(jù)remove掉闲昭,以免發(fā)生內(nèi)存的泄漏罐寨。

  • 參考資料:

Android中Application類用法
android application 詳解--深入淺出,講解完整的Application序矩,以及所涉及到的擴(kuò)展知識(shí)鸯绿。
Android筆記 Application對(duì)象的使用-數(shù)據(jù)傳遞以及內(nèi)存泄漏問(wèn)題

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市簸淀,隨后出現(xiàn)的幾起案子瓶蝴,更是在濱河造成了極大的恐慌,老刑警劉巖啃擦,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件囊蓝,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡令蛉,警方通過(guò)查閱死者的電腦和手機(jī)聚霜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)珠叔,“玉大人蝎宇,你說(shuō)我怎么就攤上這事〉话玻” “怎么了姥芥?”我有些...
    開(kāi)封第一講書人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)汇鞭。 經(jīng)常有香客問(wèn)我凉唐,道長(zhǎng),這世上最難降的妖魔是什么霍骄? 我笑而不...
    開(kāi)封第一講書人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任台囱,我火速辦了婚禮,結(jié)果婚禮上读整,老公的妹妹穿的比我還像新娘簿训。我一直安慰自己,他們只是感情好米间,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布强品。 她就那樣靜靜地躺著,像睡著了一般屈糊。 火紅的嫁衣襯著肌膚如雪的榛。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 50,050評(píng)論 1 291
  • 那天另玖,我揣著相機(jī)與錄音困曙,去河邊找鬼表伦。 笑死,一個(gè)胖子當(dāng)著我的面吹牛慷丽,可吹牛的內(nèi)容都是我干的蹦哼。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼要糊,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼纲熏!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起锄俄,我...
    開(kāi)封第一講書人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤局劲,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后奶赠,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體鱼填,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年毅戈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了苹丸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡苇经,死狀恐怖赘理,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情扇单,我是刑警寧澤商模,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站蜘澜,受9級(jí)特大地震影響施流,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鄙信,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一嫂沉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧扮碧,春花似錦、人聲如沸杏糙。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)宏侍。三九已至赖淤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間谅河,已是汗流浹背咱旱。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工确丢, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人吐限。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓鲜侥,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親诸典。 傳聞我的和親對(duì)象是個(gè)殘疾皇子描函,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容