1. 程式人生 > >Android關於context上下文定義全域性的,轉載一個大神的

Android關於context上下文定義全域性的,轉載一個大神的

大家好,今天給大家分享一下Android裡的Context的一些用法,以前經常有人在群裡問我比如我在一個工具類裡的某個方法,或者View裡需要呼叫Context.但是工具類還有View裡沒有這個上下文怎麼辦?為了解決大家的疑問,為了解決大家的疑問,我今天寫一個簡單的Demo.讓大家如何學好自如的用Context.想什麼時候有Context,什麼時候就有Context.

這裡大致可以分為兩種:一是傳遞Context引數,二是呼叫全域性的Context.

其實我們應用啟動的時候會啟動Application這個類,這個類是在AndroidManifest.xml檔案裡其實是預設的

  1. <application  
  2.        android:icon="@drawable/ic_launcher"
  3.        android:label="@string/app_name"
  4.        >  
  5.        <activity  
  6.            android:name=".ApplicationDemoActivity"
  7.            android:label="@string/app_name" >  
  8.            <intent-filter>  
  9.                <action android:name="android.intent.action.MAIN"
     />  
  10.                <category android:name="android.intent.category.LAUNCHER" />  
  11.            </intent-filter>  
  12.        </activity>  
  13.    </application>  

這個Application類是單例的,也就是說我們可以自己寫個Application(比如名為:MainApplication)類,來代替預設的Applicaiton,這個類可以儲存應用的全域性變數,我們可以定義一個全域性的Context.供外部呼叫.用法如下:
  1. package com.tutor.application;  
  2. import android.app.Application;  
  3. import android.content.Context;  
  4. publicclass MainApplication extends Application {  
  5.     /** 
  6.      * 全域性的上下文. 
  7.      */
  8.     privatestatic Context mContext;  
  9.     @Override
  10.     publicvoid onCreate() {  
  11.         super.onCreate();  
  12.         mContext = getApplicationContext();  
  13.     }     
  14.     /**獲取Context. 
  15.      * @return 
  16.      */
  17.     publicstatic Context getContext(){  
  18.         return mContext;  
  19.     }  
  20.     @Override
  21.     publicvoid onLowMemory() {  
  22.         super.onLowMemory();  
  23.     }  
  24. }  

我們需要在AndroidMainifest.xml把MainApplication註冊進去(第10行程式碼):
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3.     package="com.tutor.application"
  4.     android:versionCode="1"
  5.     android:versionName="1.0" >  
  6.     <application  
  7.         android:icon="@drawable/ic_launcher"
  8.         android:label="@string/app_name"
  9.         android:name=".MainApplication" >  
  10.         <activity  
  11.             android:name=".ApplicationDemoActivity"
  12.             android:label="@string/app_name" >  
  13.             <intent-filter>  
  14.                 <action android:name="android.intent.action.MAIN" />  
  15.                 <category android:name="android.intent.category.LAUNCHER" />  
  16.             </intent-filter>  
  17.         </activity>  
  18.     </application>  
  19. </manifest>  

為了讓大家更容易理解,寫了一個簡單的Demo.步驟如下:

第一步:新建一個Android工程ApplicationDemo,目錄結構如下:


第二步:新建MainApplication.java,程式碼和上面一樣我就不貼了.

第三步:新建一個工具類ToolsUtil.java,程式碼如下

  1. package com.tutor.application;  
  2. import android.content.Context;  
  3. import android.widget.Toast;  
  4. /** 
  5.  * @author frankiewei. 
  6.  * 應用的一些工具類. 
  7.  */
  8. publicclass ToolUtils {  
  9.     /** 
  10.      * 引數帶Context. 
  11.      * @param context 
  12.      * @param msg 
  13.      */
  14.     publicstaticvoid showToast(Context context,String msg){  
  15.         Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();  
  16.     }  
  17.     /** 
  18.      * 呼叫全域性的Context. 
  19.      * @param msg 
  20.      */
  21.     publicstaticvoid showToast(String msg){  
  22.         Toast.makeText(MainApplication.getContext(), msg, Toast.LENGTH_SHORT).show();  
  23.     }  
  24. }  

第四步:新建一個View命名為MainView.java就是我們Activity現實的View.程式碼如下:

  1. package com.tutor.application;  
  2. import android.app.Activity;  
  3. import android.content.Context;  
  4. import android.util.AttributeSet;  
  5. import android.view.LayoutInflater;  
  6. import android.view.View;  
  7. import android.widget.Button;  
  8. import android.widget.FrameLayout;  
  9. /** 
  10.  * @author frankiewei. 
  11.  * 自定義的MainView. 
  12.  */
  13. publicclass MainView extends FrameLayout implements View.OnClickListener{  
  14.     private Context mContext;  
  15.     private Activity mActivity;  
  16.     /** 
  17.      * 引數Button. 
  18.      */
  19.     private Button mArgButton;  
  20.     /** 
  21.      * 全域性Button. 
  22.      */
  23.     private Button mGlobleButton;  
  24.     /** 
  25.      * 退出Button. 
  26.      */
  27.     private Button mExitButton;  
  28.     public MainView(Context context){  
  29.         super(context);  
  30.         setupViews();  
  31.     }  
  32.     public MainView(Context context, AttributeSet attrs) {  
  33.         super(context, attrs);  
  34.         setupViews();  
  35.     }  
  36.     privatevoid setupViews(){  
  37.         //獲取View的上下文.
  38.         mContext = getContext();  
  39.         //這裡將Context轉換為Activity.
  40.         mActivity = (Activity)mContext;  
  41.         LayoutInflater inflater = LayoutInflater.from(mContext);  
  42.         View v = inflater.inflate(R.layout.main, null);  
  43.         addView(v);  
  44.         mArgButton = (Button)v.findViewById(R.id.arg_button);  
  45.         mGlobleButton = (Button)v.findViewById(R.id.glo_button);  
  46.         mExitButton = (Button)v.findViewById(R.id.exit_button);  
  47.         mArgButton.setOnClickListener(this);  
  48.         mGlobleButton.setOnClickListener(this);  
  49.         mExitButton.setOnClickListener(this);  
  50.     }  
  51.     publicvoid onClick(View v) {  
  52.         if(v == mArgButton){  
  53.             ToolUtils.showToast(mContext, "我是通過傳遞Context引數顯示的!");  
  54.         }elseif(v == mGlobleButton){  
  55.             ToolUtils.showToast("我是通過全域性Context顯示的!");  
  56.         }else{  
  57.             mActivity.finish();  
  58.         }  
  59.     }  
  60. }  
這裡MainView.java使用的佈局main.xml程式碼如下:
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:layout_width="fill_parent"
  4.     android:layout_height="fill_parent"
  5.     android:orientation="vertical">
  6.     <TextView
  7.         android:layout_width="fill_parent"