在很多地方需要用到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); }}