在实际开发中,Context意味着上下文,而Context也在很多方法的参数等地方出现,例如跳转新的Activity使用Intent意图时
Intent intent=new Intent(Lindd.this,MainActivity8.class);
但其实会发现,有时它可以写成
Intent intent=new Intent(this,MainActivity8.class);
而有的情况,写this又会出现错误,例如:
报错 Cannot resolve method 'makeText(anonymous android.view.View.OnClickListener, java.lang.String, int)'
那么this与Activity.this 的区别是什么,值得思考
首先this是Javase中的中的一个知识点,看一下this的官方解释:它是对类的当前实例的引用。
再通过一些查询可以得到这个问题的结果:两者的区别主要是Activity.this指向的总是所在的activity的class,而this 在不同上下文的时候会指向不同,和js的this有些相似,比如在button的onclick方法中直接写this的话替代的就是Button类的上下文(Context)了。
可能比较难以理解,我创建了一个Activity,分别在Activity的onCreate方法中(即以进入Activity就执行)以及findViewById找到按钮并直接通过匿名内部类的方法绑定点击事件:
(xml中就放了一个id为button的按钮就不展示xml代码)
public class MainActivity55 extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main55);
//this
Toast.makeText(this,"123",Toast.LENGTH_SHORT).show();
Log.i("Main55","this:"+this.toString());
//com.example.student.MainActivity55@6a47030
Log.i("Main55","Activity55.this:"+MainActivity55.this.toString());
//com.example.student.MainActivity55@6a47030
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
//匿名内部类
@Override
public void onClick(View v) {
Log.i("Main55btn","this:"+this.toString());
//com.example.student.MainActivity55$1@417ec25
Log.i("Main55btn","Activity55.this:"+MainActivity55.this.toString());
//com.example.student.MainActivity55@6a47030
Log.i("Main55btn","btnThis:"+findViewById(R.id.button).getContext());
//com.example.student.MainActivity55@6a47030
Toast.makeText(MainActivity55.this,"123",Toast.LENGTH_SHORT).show();
}
});
}
}
会发现一个结论在匿名内部类之外的地方,显然证明了前面标红的结论
this与Activity.this引用的是相同的
而在匿名内部类中两者是不同的,Activity.this不用赘述,而this和findViewById(R.id.button).getContext()是相同的。
那么在实际开发中,上下文全是写为Activity.this则会减少报错的机会