(轉)Android全域對象Application的使用,以及如何在任何地方得到Application全域對象

來源:互聯網
上載者:User

標籤:

Application和Activity,Service一樣是android架構的一個系統組件,當android程式啟動時系統會建立一個application對象,用來儲存系統的一些資訊。通常我們是不需要指定一個Application的,這時系統會自動幫我們建立。開啟每一個應用程式的manifest檔案,可以看到activity都是包含在application標籤之中,如下:

1234567891011121314     <application        android:label="ViewPagerIndicator Sample"        android:icon="@drawable/icon">        <activity            android:name=".ListSamples"            android:label="ViewPager Indicator">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>...................

android系統會為每個程式運行時建立一個Application類的對象且僅建立一個,所以Application是單例 (singleton)模式的一個類.且application對象的生命週期是整個程式中最長的,它的生命週期就等於這個程式的生命週期。因為它是全域的單例的,所以在不同的Activity,Service中獲得的對象都是同一個對象。因此在安卓中我們可以避免使用靜態變數來儲存長久儲存的值,而用Application。

為了更好的利用Application的這一特性,比如我們需要Application來儲存一些靜態值,需要自訂繼承於Application的類,然後在這個類中定義一個變數來儲存。在預設情況下應用系統會自動產生Application 對象,但是如果我們自訂了Application,那就需要告知系統,執行個體化的時候,是執行個體化我們自訂的,而非預設的。比如我們自訂了一個AppContext類:

12345678 public class AppContext extends Application {                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    public static final int NETTYPE_WIFI = 0x01;    public static final int NETTYPE_CMWAP = 0x02;    public static final int NETTYPE_CMNET = 0x03;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    public static final int PAGE_SIZE = 20;//預設分頁大小    private static final int CACHE_TIME = 10*60000;//緩衝失效時間

為了讓系統執行個體化的時候找到,我們必須在manifest中修改application標籤屬性:

12345 <application    android:name=".AppContext"    android:icon="@drawable/ic_launcher"    android:label="@string/app_name"    android:theme="@style/AppTheme" >

關鍵的是這句:android:name=".AppContext"

通常Application全域對象是通過Context或者Activity的getApplicationContext()方法獲得的比如我們在應用程式中想要獲得我們剛剛定義的AppContext對象,就需要在activity中這樣做:

appContext = (AppContext)this.getApplicationContext();

如果有Context對象,還可以:appContext = (AppContext)mContext.getApplicationContext();

但是很多時候我們的代碼可能在activity之外,且沒有context對象的引用,但是又需要獲得AppContext對象,原始的做法可能是想辦法將activity或者context傳遞到需要調用的地方,但是這樣代碼耦合度太高,可讀性差。我們有更優雅的做法。

我們談到Application對象是全域的,單例的,既然是單例應該有一個類方法能讓我們獲得這個單例對象才是,但Application本身沒有,我們只能在自訂的時候想辦法。

Application是系統的一個組件,也就有自己的生命週期函數,讓人感到意外的是他的生命週期函數中居然也有onCreate(),onCreate是被自動調用的,我們可以利用這點來獲得這個Application對象。

在AppContext中加入如下幾行代碼:

12345678910 private static AppContext instance;public static AppContext getInstance() {    return instance;} @Overridepublic void onCreate() {    // TODO Auto-generated method stub    super.onCreate();    instance = this;}


這樣我們就能在app工程的任何地方通過AppContext.getInstance()來獲得Application全域對象。比如我定義了一個工具類,在工具內中我們需要使用

Context的getExternalFilesDir()方法。但是這個工具類沒有直接的辦法擷取到context,於是我們可以:

1 returnAppContext.getInstance().getExternalFilesDir(null);

 

(轉)Android全域對象Application的使用,以及如何在任何地方得到Application全域對象

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.