Android使用Application總結

SDK中的描述:Application類是爲了那些須要保存全局變量設計的基本類,你能夠在AndroidManifest.xml的<application>標籤中進行本身的實現,這樣的結果是:當你的application或者包被創建的時候將引發那個類被創建。
理解:就是說application是用來保存全局變量的,而且是在package建立的時候就跟着存在了。因此當咱們須要建立全局變量的時候,不需 要再像j2se那樣須要建立public權限的static變量,而直接在application中去實現。只須要調用Context的getApplicationContext或者Activity的getApplication方法來得到一個application對象,再作出相應 的處理。前端

例如Launcher模塊中;它本身就寫了個application,在AndroidManifest.xml中將它進行了設置:android

<application
        android:name="com.android.launcher2.LauncherApplication"緩存

對於他的設置能夠參考這個模塊。app

android.app.Application類包含了4個公開的方法框架

void  onConfigurationChanged(Configuration newConfig)
void  onCreate()  //這裏纔是真正的入口點。
void  onLowMemory()
void  onTerminate()ide

1:Application是什麼?網站

1
Application和Activity,Service同樣,是android框架的一個系統組件,當android程序啓動時系統會建立一個 application對象,用來存儲系統的一些信息。一般咱們是不須要指定一個Application的,這時系統會自動幫咱們建立,若是須要建立本身 的Application,也很簡單建立一個類繼承 Application並在manifest的application標籤中進行註冊(只須要給Application標籤增長個name屬性把本身的 Application的名字定入便可)。

android系統會爲每一個程序運行時建立一個Application類的對象且僅建立一個,因此Application能夠說是單例 (singleton)模式的一個類.且application對象的生命週期是整個程序中最長的,它的生命週期就等於這個程序的生命週期。由於它是全局 的單例的,因此在不一樣的Activity,Service中得到的對象都是同一個對象。因此經過Application來進行一些,數據傳遞,數據共享 等,數據緩存等操做。this

2:經過Application傳遞數據spa

 
     假若有一個Activity A, 跳轉到 Activity B ,並須要推薦一些數據,一般的做法是Intent.putExtra() 讓Intent攜帶,或者有一個Bundle把信息加入Bundle讓Intent推薦Bundle對象,實現傳遞。但這樣做有一個問題在 於,Intent和Bundle所能攜帶的數據類型都是一些基本的數據類型,若是想實現複雜的數據傳遞就比較麻煩了,一般須要實現 Serializable或者Parcellable接口。這實際上是Android的一種IPC數據傳遞的方法。若是咱們的兩個Activity在同一個 進程當中爲何還要這麼麻煩呢,只要把須要傳遞的對象的引用傳遞過去就能夠了。
    基本思路是這樣的。在Application中建立一個HashMap ,以字符串爲索引,Object爲value這樣咱們的HashMap就能夠存儲任何類型的對象了。在Activity A中把須要傳遞的對象放入這個HashMap,而後經過Intent或者其它途經再把這索引的字符串傳遞給Activity B ,Activity B 就能夠根據這個字符串在HashMap中取出這個對象了。只要再向下轉個型 ,就實現了對象的傳遞。

3:Application數據緩存設計

  我通常會習慣在application中創建兩個HashMap一個用於數據的傳遞,一個用於緩 存一些數據。好比有一個Activity須要從網站獲取一些數據,獲取完以後咱們就能夠把這個數據cache到Application 當中,當頁面設置到其它Activity再回來的時候,就能夠直接使用緩存好的數據了。但若是須要cache一些大量的數據,最好是cache一些 (軟引用)SoftReference ,並把這些數據cache到本地rom上或者sd卡上。若是在application中的緩存不存在,從本地緩存查找,若是本地緩存的數據也不存在再從網 絡上獲取。

6:生命週期:

onCreate 在建立應用程序時建立
onTerminate 當終止應用程序對象時調用,不保證必定被調用,當程序是被內核終止以便爲其餘應用程序釋放資源,那
麼將不會提醒,而且不調用應用程序的對象的onTerminate方法而直接終止進 程
onLowMemory 當後臺程序已經終止資源還匱乏時會調用這個方法。好的應用程序通常會在這個方法裏面釋放一些沒必要
要的資源來應付當後臺程序已經終止,前臺應用程序內存還不夠時的狀況。
onConfigurationChanged 配置改變時觸發這個方法

備註:application 被殺死的狀況分析:
爲了決定在內存較低的時候殺掉哪一個進程, Android會根據運行在這些進程內的組件及他們的狀態把進程劃分紅一個」重要程度層次」. 其重要的程度按如下規則排序:
1:前端進程能夠是一個持有運行在屏幕最前端並與用戶交互的Activity的進程(onResume方法被調用時),也能夠是持有一個正在運行的IntentReceiver(也就是說他正在執行本身的onReceiveIntent方法)的進程. 在系統中, 只會有少數這樣的進程, 而且除非內存已經低到不夠這些進程運行, 不然系統不會主動殺掉這些進程. 這時, 設備一般已經達到了須要內存整理的狀態, 因此殺掉這些進程是爲了避免讓用戶界面中止響應.
2:可視進程是持有一個被用戶可見, 但沒有顯示在最前端 (onPause方法被調用時) 的Activity的進程. 舉例來講, 這種進程一般出如今一個前端Activity以一個對話框出現並保持前一個Activity可見時. 這種進程被系統認爲是極其重要的, 而且一般不會被殺掉, 除非爲了保持全部前端進程正常運行不得不殺掉這些可見進程.
3:服務進程是持有一個Service的進程, 該Service是由startService()方法啓動的, 儘管這些進程用戶不能直接看到, 可是一般他們作的工做用戶是十分關注的(例如, 在後臺播放mp3或是在後臺下載 上傳文件), 因此, 除非爲了保持全部的前端進程和可視進程正常運行外, 系統是不會殺掉服務進程的.
4:後臺進程是持有一個再也不被用戶可見的Activity(onStop()方法被調用時)的進程. 這些進程不會直接影響用戶體驗. 加入這些進程已經完整的,正確的完成了本身的生命週期(訪問Activity查看更多細節), 系統會在爲前三種進程釋放內存時隨時殺掉這些後臺進程. 一般會有不少的後臺進程在運行, 因此這些進程被存放在一個LRU列表中, 以保證在低內存的時候, 最近一個被用戶看到的進程會被最後殺掉.
5:空進程是沒有持有任何活動應用組件的進程. 保留這種進程的惟一理由是爲了提供一種緩存機制, 縮短他的應用下次運行時的啓動時間. 就其自己而言, 系統殺掉這些進程的目的是爲了在這些空進程和底層的核心緩存之間平衡整個系統的資源.

application文件:

Java代碼:

複製代碼
public class TestApplication extends Application {

private int curIndex;

public int getCurIndex() {

return curIndex;

}

public void setCurIndex(int curIndex) {

this.curIndex = curIndex;

}

@Override

public void onCreate() {

super.onCreate();

}

@Override

public void onTerminate() {

super.onTerminate();

}

}
複製代碼

application中有一個curIndex和setter getter方法。

第一個acitivty中對application進行的操做:

Java代碼:

TestApplication application = (TestApplication) this.getApplication();

Log.i("data", ""+application.getCurIndex());

application.setCurIndex(5);

第二個Activity:

Java代碼:

TestApplication application = (TestApplication)this.getApplication();

Log.i("data", ""+application.getCurIndex());

application.setCurIndex(6);

第三個Activity:

Java代碼

final TestApplication application = (TestApplication) this.getApplication();

Log.i("data", ""+application.getCurIndex());

在運行過程當中,每一次都kill掉對應的Activity,再進入下一個Activity。

相關文章
相關標籤/搜索