android中的this,Context到底該怎麼用
在Android系統中,有很多的service,也就是服務。我們的程式如果用到系統功能,一般都是呼叫服務間接完成的。也就是在Android系統中存在許多C/S架構。而context的作用,就是android應用連線service的橋樑。比如Activity中有一個方法,getSystemService()。這個方法調到最後,實際上是呼叫的ContextImpl的getSystemService()方法。而ContextImpl是對Context的實現。
Context不是函式而是一個類——如果不太瞭解面向物件,可以把“類”看做一種資料型別,就像int,不過型別為“類”的資料(稱為物件)可能儲存遠比int多的資訊,比如這裡的型別為Context的物件就儲存關於程式、視窗的一些資源
有些函式呼叫時需要一個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
如果想要彈出一個AlertDialog,要寫如下的程式碼
1 2 3 4 |
|
這裡構造方法的原型是AlertDialog.Builder(Context arg) 需要一個Context類的物件作為引數,一般我們都在Activity裡寫,所以用this,表示在當前的會話中彈出AlertDialog。
在我的一個程式裡,我自定義了一個介面Public interface CustomPickerListener,在實現這個介面的方法時我需要彈出來一個AlertDialog,這裡,引數表裡填寫this的話會提示錯誤:The constructor AlertDialog.Builder(new CustomPickerListener(){}) is undefined.
其實這個地方寫this很明顯是錯誤的,但是要寫什麼才能達成目的呢?
官方文件上對context的解釋是Interface to global information about an application environment. This is an abstract class whose implementation is provided by the Android system. It allows access to application-specific resources and classes, as well as up-calls for application-level operations such as launching activities, broadcasting and receiving intents, etc.
於是我就試著寫上了我程式的 包.目標類.this ,如下
1 |
|
然後就成功了