天天看點

Android使用Application總結

SDK中的描述:Application類是為了那些需要儲存全局變量設計的基本類,你可以在AndroidManifest.xml的<application>标簽中進行自己的實作,這樣的結果是:當你的application或者包被建立的時候将引起那個類被建立。

了解:就是說application是用來儲存全局變量的,并且是在package建立的時候就跟着存在了。是以當我們需要建立全局變量的時候,不需 要再像j2se那樣需要建立public權限的static變量,而直接在application中去實作。隻需要調用Context的getApplicationContext或者Activity的getApplication方法來獲得一個application對象,再做出相應 的處理。

例如Launcher子產品中;它自己就寫了個application,在AndroidManifest.xml中将它進行了設定:

<application

        android:name="com.android.launcher2.LauncherApplication"

對于他的設定可以參考這個子產品。

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

void  onConfigurationChanged(Configuration newConfig)

void  onCreate()  //這裡才是真正的入口點。

void  onLowMemory()

void  onTerminate()

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來進行一些,資料傳遞,資料共享 等,資料緩存等操作。

2:通過Application傳遞資料

假如有一個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代碼:

Android使用Application總結
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();

}

}      
Android使用Application總結

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

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

Java代碼:

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

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

application.setCurIndex(5);

第二個Activity:

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

application.setCurIndex(6);

第三個Activity:

Java代碼