android-application學習

  • 介紹:

Application是單例模式的類,android系統為每個應用程序創建一個Application類的對象且只創建一個。
啟動Application時,系統會創建一個PID,即進程ID,所有的Activity都會在此進程上運行
Application創建的時候初始化全局變量,同一個應用的所有Activity都可以取到這些全局變量的值
Application對象的生命周期是整個程序中最長的,它的生命周期就等于這個程序的生命周期
Application全局的單例的,所以在不同的Activity,Service中獲得的對象都是同一個對象

  • 應用領域:數據傳遞、數據共享和數據緩存等操作。

    • 復雜數據的傳遞:
      • Activity A, 跳轉到 Activity B,用Intent.putExtra() 或者Bundle進行傳遞數據,但是:Intent和Bundle所能攜帶的數據類型都是一些基本的數據類型,想實現復雜的數據傳遞就比較麻煩了,通常需要實現 Serializable或者Parcellable接口
      • Application進行解決:(思路)
        Application中創建一個HashMap ,以字符串為索引,Object為value這樣我們的HashMap就可以存儲任何類型的對象了。在Activity A中把需要傳遞的對象放入這個HashMap,然后通過Intent或者其它途經再把這索引的字符串傳遞給Activity B ,Activity B 就可以根據這個字符串HashMap中取出這個對象了。只要再向下轉個型 ,就實現了對象的傳遞。
  • 生命周期

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

實現步驟:

1.繼承Application

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

繼承Application類,主要重寫里面的onCreate()方法(android.app.Application包的onCreate()才是真正的Android程序的入口點)
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對象
                   Log.i("FirstActivity", "初始值=====" + app.getValue()); // 獲取進程中的全局變量值,看是否是初始化值
                   app.setValue("Harvey Ren"); // 重新設置值
                   Log.i("FirstActivity", "修改后=====" + app.getValue()); // 再次獲取進程中的全局變量值,看是否被修改
               }
           }
    

只需要調用ContextgetApplicationContext或者Activity的getApplication方法獲得一個Application對象,然后再得到相應的成員變量即可。

  • 知識延伸:

MemoryLeak
在Java中內存泄漏是指:某個(某些)對象已經不在被使用應該被gc所回收,但有一個對象持有這個對象的引用而阻止這個對象被回收。比如我們通常會這樣創建一個View TextView tv = new TextView(this);這里的this通常都是Activity。所以這個TextView就持有著這個Activity的引用。
通常情況下,當用戶轉動手機的時候,android會重新調用OnCreate()方法生成一個新的Activity,原來的 Activity應該被GC所回收。但如果有個對象比如一個View的作用域超過了這個Activity(比如有一個static對象或者我們把這個 View的引用放到了Application當中),這時候原來的Activity將不能被GC所回收Activity本身又持有很多對象的引用,所以 整個Activity的內存被泄漏了。

備注:經常導致內存泄漏核心原因:
keeping a long-lived reference to a Context.持有一個context的對象,從而gc不能回收。

- 1.**一個View的作用域超出了所在的Activity的作用域**,比如一個static的View或者把一個View cache到了application當中 etc

理解:內存:注意靜態的數據和緩存中的數據;注意釋放;
- 2.某些與View關聯的Drawable的作用域超出了Activity的作用域。
- 3.Runnable對象:比如在一個Activity中啟用了一個新線程去執行一個任務,在這期間這個Activity被系統回收了, 但Runnalbe的 任務還沒有執行完畢并持有Activity的引用而泄漏,但這種泄漏一般來泄漏一段時間,只有Runnalbe的線程執行完閉,這個 Activity又可以被正常回收了。
- 4.內存類的對象作用域超出Activity的范圍:比如定義了一個內存類來存儲數據,又把這個內存類的對象傳給了其它Activity 或者Service等。因為內部類的對象會持有當前類的引用,所以也就持有了Context的引用解決方法是如果不需要當前的引用把內部類寫成static或者,把內部類抽取出來變成一個單獨的類,或者把避免內部對象作用域超出Activity的作用域。
out Of Memery Error 在android中每一個程序所分到的內存大小是有限的,如果超過了這個數就會報Out Of Memory Error
- 注意:所以盡量把程序中的一些大的數據cache到本地文件。以免內存使用量超標。記得數據傳遞完成之后,把存放在application的HashMap中的數據remove掉,以免發生內存的泄漏。

  • 參考資料:

Android中Application類用法
android application 詳解--深入淺出,講解完整的Application,以及所涉及到的擴展知識。
Android筆記 Application對象的使用-數據傳遞以及內存泄漏問題

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,563評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,694評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,672評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,965評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,690評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,019評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,013評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,188評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,718評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,438評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,667評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,149評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,845評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,252評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,590評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,384評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內容