1. 最近看的代码中经常看见this,在java中的this第一反应就是当前对象,可以用来引用变量或是方法,一看就很懵B,所以这里通过例子来详细讲下this的用法。

2.例如下面代码

button.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {
Toast.makeText(TextC.this,"什么情况",1000).show();}

通俗讲,this就是指本类,但在上面Toast中直接写this会出错,因为当前本类是OnClickListener类,而不是我们的主类,如activity(或是mainActivity等),而this就是指向当前类OnClickListener。

3.再如:MainActivity中setOnClickListener(this)中的this指代什么?

setOnClickListener的参数要求是一个实现了OnClickListener接口的对象实体,它可以是任何类的实例,只要该类实现了OnClickListener。这个问题中,this它就是MainActivity这个对象自己且用this实现了OnClickListener。

4.MainActivity.this是什么意思?

表示的就是MainActivity这个类对象本来,这种写法一般用在内部类里,因为在外部类中直接可以用关键字this表示本类,而内部类中直接写this的话表示的是内部类本身,想表示外部类的话就得加上外部类的类名.this。

5.在android中this使用的小结

this代表本类的一个引用,this.*表示调用本类的某个方法,这个时候通常可以省略this;但在内部类中不能省略,否则编译器会认为是内部类的引用,所以要在this前加上类名. *.this 表示本类的引用,通常前面的*是用本类的名字表示,当然也可以省略,但是如果是在内部类中一定要加上类名,同时注意:this和static不能共存,就是在static修饰的方法中不能用this.


6.android context是什么 ?从SDK中可以知道

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-cal for application-level operations such as launching activities, broadcasting and receiving intents, etc


从上的描述可以知道context和一下三点作用:

  • 它描述的是一个应用程序的环境,即上下文
  • 它类是一个抽象的类,android提供了一个具体的通用实现类contextIml类。
  • 它就像是一个大管家,是一个访问全局信息的接口。通过它我们可以获取应用程度 的资源的类,包括一些应用级的操作,如启动一个activity,发送广播,接受Intent信息。

7.context家族的关系

8.android context源码简析

8.1Context.java:抽象类,提供了一组通用的API

public abstract class Context {  ...  public abstract Object getSystemService(String name);  //获得系统级服务  public abstract void startActivity(Intent intent);     //通过一个Intent启动Activity  public abstract ComponentName startService(Intent service);  //启动Service  //根据文件名得到SharedPreferences对象  public abstract SharedPreferences getSharedPreferences(String name,int mode);  ...
}  

8.2 Contextlml.java:Context和实现类,但函数的大部分功能都是直接调用其属性的mPackageInfo去完成

/** * Common implementation of Context API, which provides the base * context object for Activity and other application components. */
class ContextImpl extends Context{  //所有Application程序公用一个mPackageInfo对象  /*package*/ ActivityThread.PackageInfo mPackageInfo;  @Override  public Object getSystemService(String name){  ...  else if (ACTIVITY_SERVICE.equals(name)) {  return getActivityManager();  }   else if (INPUT_METHOD_SERVICE.equals(name)) {  return InputMethodManager.getInstance(this);  }  }   @Override  public void startActivity(Intent intent) {  ...  //开始启动一个Activity  mMainThread.getInstrumentation().execStartActivity(  getOuterContext(), mMainThread.getApplicationThread(), null, null, intent, -1);  }
}  

8.3 ContextWrapper.java:该类只是对Context类的一种包装,该类的构造函数包含了一个真正的Context引用,即ContextIml对象。

public class ContextWrapper extends Context {  Context mBase;  //该属性指向一个ContextIml实例,一般在创建Application、Service、Activity时赋值  //创建Application、Service、Activity,会调用该方法给mBase属性赋值  protected void attachBaseContext(Context base) {  if (mBase != null) {  throw new IllegalStateException("Base context already set");  }  mBase = base;  }  @Override  public void startActivity(Intent intent) {  mBase.startActivity(intent);  //调用mBase实例方法  }
}  

8.4ContextThemeWrapper.java:该类内部包含了主题(Theme)相关的接口,即android:theme属性指定的。只有Activity需要主题,Service不需要主题,所以Service直接继承于ContextWrapper类。

public class ContextThemeWrapper extends ContextWrapper {  //该属性指向一个ContextIml实例,一般在创建Application、Service、Activity时赋值  private Context mBase;  //mBase赋值方式同样有一下两种  public ContextThemeWrapper(Context base, int themeres) {  super(base);  mBase = base;  mThemeResource = themeres;  }  @Override  protected void attachBaseContext(Context newBase) {  super.attachBaseContext(newBase);  mBase = newBase;  }
}  

9.Activity类 、Service类 、Application类本质上都是Context子类,所以应用程序App共有的Context数目公式为:

总Context实例个数 = Service个数 + Activity个数 + 1(Application对应的Context实例)


10.AR/VR研究的朋友可以加入下面的群或是关注下面的微信公众号

android studio for android learning (二十 )android中this、context等关键概念理解全解相关推荐

  1. Android开发笔记(一百二十六)自定义音乐播放器

    MediaRecorder/MediaPlayer 在Android手机上面,音频的处理比视频还要复杂,这真是出人意料.在前面的博文< Android开发笔记(五十七)录像录音与播放>中, ...

  2. Android开发笔记(一百二十二)循环器视图RecyclerView

    RecyclerView RecyclerView是Android在support-v7库中新推出控件,中文别名为循环器视图,它的功能非常强大,可分别实现ListView.GridView,以及瀑布流 ...

  3. Android Studio开发蓝牙应用(二)

    Android Studio开发蓝牙应用(二) 实现的功能 与蓝牙模块HC-06交换信息 过程 新建Empty Activity 创建布局 activity_btread_and_write.xml ...

  4. 【Android Studio安装部署系列】十九、Android studio使用SVN

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 在AndroidStudio中开发版本控制,除了Git就是SVN,和Eclipse不同,Android Studio没有提供单独的插 ...

  5. 【Android Studio探索之路系列】之四:Android Studio快捷键

    作者:郭孝星 微博:郭孝星的新浪微博 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells github:https://github.co ...

  6. 用较新版本的Android Studio Chipmunk编译旧版本的Android 21的Sample

    技术发展这么快,经常遇到需要使用新版本的Android Studio来开发运行旧的Android工程,此时需要处理gradle兼容的问题 问题一.Could not install Gradle di ...

  7. android studio 远程调试,Unity3D学习笔记——Android远程真机调试(Unity Remote)

    前言:当使用Unity开发移动端的游戏,特别是使用到手机的传感器,如重力感应等,调试的时候,很麻烦, 因为每次都需要编译成APK后安装到手机中测试,而Unity Remote便能很好的解决这个问题,U ...

  8. access中的android sdk,Android Studio报错unable to access android sdk add-on list解决方案

    一.问题 初次安装Android Studio,启动后,报错如下: unable to access android sdk add-on lis 如图: 二.原因 AS启动后,会在默认路径下检测是否 ...

  9. android studio device功能,Android Studio 3.0找不到Android Device Monitor

    因为自Android Studio 3.0开始弃用Android Device Monitor,Android Developers官网上的原话是: Android Device Monitor is ...

  10. Android Studio同步失败设置代理,Android Studio如何设置代理?

    由于使用Android Studio期间,很多时候都要访问谷歌官方服务器,但是由于一些其他原因,会导致连接不上或者速度很慢,那就需要我们设置一下国内的镜像代理了.下面,让我们一起来看看Android ...

最新文章

  1. 风变python小课离线版_Python是个什么鬼?为什么医学生朋友圈里都是它!
  2. VS2005代码格式化
  3. 基于Spring Security的认证授权_认证原理_授权流程_Spring Security OAuth2.0认证授权---springcloud工作笔记126
  4. 欲学机器学习必先掌握Shell,AI工程师自制教程,获Reddit网友400+点赞 | PDF+视频...
  5. Silverlight 游戏开发“.NET研究”小技巧:血条和进度条
  6. 信息技术手册查重错误比对分析程序开发记录3
  7. 第一个Maven工程的目录结构和文件内容及联网问题
  8. Arduino学习笔记:基于LiquidCrystal库运行LCD1602
  9. AtomicReference使用场景
  10. Hadoop(八)网站流量分析
  11. 微信公众号开发:Java后台如何处理公众号关注和取关事件
  12. 暴雪娱乐-魔兽世界:地下城的环境艺术
  13. 中国首枚NFC邮票发行背后,NFC技术的“有限性”创新
  14. linux上如何搭建Java环境
  15. mysql doesn t exist_Mysql的“Table 'mysql.servers' doesn't exist”的解决方法
  16. CSU2020期中测试模拟题1 问题E:小帅的字符串
  17. 网络容易丢包情况汇总
  18. 【教程】在Radmixture运行无标杆成分名的任意祖源计算器的方法
  19. java仿QQ微信聊天室
  20. 线性代数复习归纳(一):矩阵+例题

热门文章

  1. 多路复用输入/输出 ---- select
  2. POJ 3250:Bad Hair Day 好玩的单调栈
  3. Apache Prefork、Worker和Event三种工作模式分析
  4. JQuery中操作Css样式
  5. Python 2.7的新特性
  6. 看mysql手册中模式(SQL_MODE)学到的知识
  7. linux 后台进程管理,Linux 后台进程管理利器 Supervisor
  8. 百元百鸡 //构造结构体变量
  9. mysql损坏打不开_mysql 断电导致表打不开解决方案
  10. android中的actionbar,android中开启actionbar的两种方法