Android中使用MainActivity.this和this情況
剛接觸Android,有新鮮感,也有很多困惑,MainActivity.this就是一個典型。
- Context和Activity的關係
在很多地方需要用到Context這個類作為引數,我們一個是用 SomeActivity.this傳遞。
MainActivity.this 為什麼就可以代表Context了呢?
去谷歌官網,搜尋Context發現,Activity是Context的間接子類,Context是Activity的間接基類。
那麼根據語法,Activity就是一個Context。
- 類名.this 這種語法在什麼情況下會出現呢?
一句話:內部類需要用到外部類的成員變數或方法。
附加說明:如果重名則必須“類名.this”指定那個類的成員變數或方法,如果沒有重名則該變數可以指定所屬類也可以不指定所屬類。
舉個例子:
[java] view plain copy
public class Demo {
int n = 100;
public void show(){ A a = new A(); a.foo(); } // 內部類 class A{ public int n = 200; void foo(){ System.out.println("Demo::A::foo(): " + n); // 內部類需要用到外部類的成員或方法 System.out.println("Demo.this.n : " + Demo.this.n); } }
}
上面程式碼中,類A是一個內部類,它想呼叫外面的n,這裡由於n變數在內部類A中 和外部類Demo中重名,所以必須用Demo.this.n來區分呼叫的是哪一個變數n。
- 再看MainActivity.this
給一段我們經常用到的程式碼片段 (其他程式碼略)
[java] view plain copy
public class MainActivity extends Activity{
// MainActivity 的內部類MyClickListener 表示按鈕監聽 private class MyClickListener implements OnClickListener{ @Override public void onClick(View v) { // 如果這裡用this則表示MyClickListener的這個類的物件;該物件並不是Context的子類 // 因此Intent 的第一個引數必須是 該類外部類,需要明確指出 Intent intent = new Intent (MainActivity.this, SomeActivity.class); <span style="white-space:pre"> </span>startActivity(intent); } }
}
[java] view plain copy
[java] view plain copy
Intent intent = new Intent (MainActivity.this, SomeActivity.class);
建立Intent物件時,傳入第一個引數是個Context,一般我們用當前的Activity。
由於每一個類都有一個成員變數,名叫this。 有重名衝突,此時,在MyClickListener類中寫下這行程式碼,那麼 this代表的是當前的內部類,即MyClickListener。
OnClickListener類並不是Context的子類,直接用this會報錯。因此這裡必須顯示指定外部類的那個this,用MainActivity.this指明。
假如,把這行程式碼換個位置,放到MainActivity的onCreate()中去,(在建立的時候,轉到其他Activity,看似沒什麼意義,為了理解有幫助)
[java] view plain copy
Intent intent = new Intent (MainActivity.this, SomeActivity.class);
移到onCreate中:
[java] view plain copy
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent (this, SomeActivity.class);
startActivity(intent);
}
}