日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Android全局對象Application的使用,以及如何在任何地方得到Application全局對象

 aaie_ 2016-01-19

Application和Activity,Service一樣是android框架的一個系統(tǒng)組件,當(dāng)android程序啟動時系統(tǒng)會創(chuàng)建一個application對象,用來存儲系統(tǒng)的一些信息。通常我們是不需要指定一個Application的,這時系統(tǒng)會自動幫我們創(chuàng)建。打開每一個應(yīng)用程序的manifest文件,可以看到activity都是包含在application標(biāo)簽之中,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
    <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系統(tǒng)會為每個程序運(yùn)行時創(chuàng)建一個Application類的對象且僅創(chuàng)建一個,所以Application是單例 (singleton)模式的一個類.且application對象的生命周期是整個程序中最長的,它的生命周期就等于這個程序的生命周期。因?yàn)樗侨值膯卫?,所以在不同的Activity,Service中獲得的對象都是同一個對象。因此在安卓中我們可以避免使用靜態(tài)變量來存儲長久保存的值,而用Application。

為了更好的利用Application的這一特性,比如我們需要Application來保存一些靜態(tài)值,需要自定義繼承于Application的類,然后在這個類中定義一個變量來保存。在默認(rèn)情況下應(yīng)用系統(tǒng)會自動生成Application 對象,但是如果我們自定義了Application,那就需要告知系統(tǒng),實(shí)例化的時候,是實(shí)例化我們自定義的,而非默認(rèn)的。比如我們自定義了一個AppContext類:

1
2
3
4
5
6
7
8
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;//默認(rèn)分頁大小
    private static final int CACHE_TIME = 10*60000;//緩存失效時間

為了讓系統(tǒng)實(shí)例化的時候找到,我們必須在manifest中修改application標(biāo)簽屬性:

1
2
3
4
5
<application
    android:name=".AppContext"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >

關(guān)鍵的是這句:android:name=".AppContext"

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

appContext = (AppContext)this.getApplicationContext();

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

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

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

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

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

1
2
3
4
5
6
7
8
9
10
private static AppContext instance;
public static AppContext getInstance() {
    return instance;
}
@Override
public void onCreate() {
    // TODO Auto-generated method stub
    super.onCreate();
    instance = this;
}


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

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

1
return AppContext.getInstance().getExternalFilesDir(null);

轉(zhuǎn)自:http://www./a/anzhuokaifa/androidkaifa/2013/0924/1558.html

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多