1. 程式人生 > >Android 全域性獲取Context(隨時隨地的使用Context)

Android 全域性獲取Context(隨時隨地的使用Context)

參考:《第一行程式碼》第13章

#####################################################

很多地方都需要使用Context,彈出Toast/啟動活動/傳送廣播/操作資料庫/使用通知等

活動(Activity)本身就是一個Context物件,但當應用程式的架構開始複雜起來,很多的邏輯程式碼都將脫離Activity類,但此時又恰恰需要使用Context,這時,問題來了?

##################################################

第一種獲取Context的方法

在被呼叫方法的引數中設定一個Context,等待其他方法呼叫時傳入一個Context,這時就可以使用

#####################################################

第二種方法(更有效)

Android提供了一個Application類,每當應用程式啟動的時候,系統就會自動將這個類進行初始化。而我們可以定製一個自己的Application類,以便於管理程式內一些全域性的狀態資訊,比如說全域性Context

首先,建立一個MyApplication類繼承自Application:

package com.example.mylibrary;

import android.app.Application;
import android.content.Context;

/**
 * Created by root on 15-10-1.
 */
public class MyApplication extends Application {
    
    private static Context context;

    @Override
    public void onCreate() {
         super.onCreate(); 
         context = getApplicationContext();
    }
    
    public static Context getContext() {
        return context;
    }
}

上面程式碼中,重寫了父類的onCreate()方法,並通過呼叫getApplicationContext()方法得到了一個應用程式級別的Context,然後又提供了一個靜態的getContext方法,將剛才獲取到的Context進行返回

下面,我們需要告知系統,當程式啟動的時候應該初始化MyApplication類,而不是預設的Application類。

在AndroidManifest.xml檔案的<application>標籤下進行指定就可以了:

    <application
        android:name="com.example.mylibrary.MyApplication"

注意:在這裡指定MyApplication的時候一定要加上完整的包名,不然系統將無法找到這個類

這樣就實現了一種全域性獲取Context的機制,之後不管你想在專案的任何地方使用Context,只需要呼叫一下MyApplication.getContext()就可以了

Toast.makeText(MyApplication.getContext(), "hello mylibrary", Toast.LENGTH_SHORT).show();