1. 程式人生 > >Android中使用MainActivity.this和this情況

Android中使用MainActivity.this和this情況

剛接觸Android,有新鮮感,也有很多困惑,MainActivity.this就是一個典型。
  1. Context和Activity的關係

在很多地方需要用到Context這個類作為引數,我們一個是用 SomeActivity.this傳遞。

MainActivity.this 為什麼就可以代表Context了呢?

去谷歌官網,搜尋Context發現,Activity是Context的間接子類,Context是Activity的間接基類。

那麼根據語法,Activity就是一個Context。

  1. 類名.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。

  1. 再看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);  
}  

}