天天看點

android中的context是起什麼作用?

當我們通路目前應用的資源,啟動一個新的activity的時候都需要提供Context。

Context是一個抽象基類,我們通過它通路目前包的資源(getResources、getAssets)和啟動其他元件(Activity、Service、Broadcast)以及得到各種服務(getSystemService),當然,通過Context能得到的不僅僅隻有上述這些内容。對Context的了解可以來說:Context提供了一個應用的運作環境,在Context的大環境裡,應用才可以通路資源,才能完成和其他元件、服務的互動,Context定義了一套基本的功能接口,可以了解為一套規範,而Activity和Service是實作這套規範的子類,這麼說也許并不準确,因為這套規範實際是被ContextImpl類統一實作的,Activity和Service隻是繼承并有選擇性地重寫了某些規範的實作。

有些函數調用時需要一個Context參數,比如Toast.makeText,因為函數需要知道是在哪個界面中顯示的Toast。
再比如,Button myButton = new Button(this); 這裡也需要Context參數(this),表示這個按鈕是在“this”這個螢幕中顯示的。
Android開發使用(純粹的)面向對象語言,一切都是對象,就連我們寫的函數都是對象的函數。
public class MainActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toast.makeText(this,
                "OK!", 
                Toast.LENGTH_LONG).show();
        Button button1 = (Button)findViewById(R.id.button1);
        button1.setOnClickListener(new Button.OnClickListener(){ 
            public void onClick(View v)
            {
                Toast.makeText(MainActivity.this,
                        "Hello, world!", 
                        Toast.LENGTH_LONG).show();
            }
        });
    }
}
這裡OnCreate就是MainActivity的對象的函數(MainActivity是類),是以這個函數中的this就表示目前的、包含這個函數的MainActivity對象。
MainActivity extends Activity,意思是MainActivity 繼承 Activity,即MainActivity 是 Activity 的一種,所有的MainActivity 都是 Activity。同樣,在Android文檔中Activity繼承ContextThemeWrapper,ContextThemeWrapper繼承ContextWrapper,ContextWrapper繼承Context。是以this這個MainActivity也是Context,把this傳入Toast.makeText表示“OK!”是在目前的MainActivity對象(也是Context)中顯示的。
對于顯示"Hello, world!"的Toast.makeText,這個函數在onClick中,而onClick是new Button.OnClickListener(){...}這個沒有名字的類的函數,this表示匿名類的對象,不表示MainActivity對象,是以這裡用MainActivity.this,強制選擇外面一層MainActivity的this。      

繼續閱讀