android studio for android learning (二十 )android中this、context等关键概念理解全解
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等关键概念理解全解相关推荐
- Android开发笔记(一百二十六)自定义音乐播放器
MediaRecorder/MediaPlayer 在Android手机上面,音频的处理比视频还要复杂,这真是出人意料.在前面的博文< Android开发笔记(五十七)录像录音与播放>中, ...
- Android开发笔记(一百二十二)循环器视图RecyclerView
RecyclerView RecyclerView是Android在support-v7库中新推出控件,中文别名为循环器视图,它的功能非常强大,可分别实现ListView.GridView,以及瀑布流 ...
- Android Studio开发蓝牙应用(二)
Android Studio开发蓝牙应用(二) 实现的功能 与蓝牙模块HC-06交换信息 过程 新建Empty Activity 创建布局 activity_btread_and_write.xml ...
- 【Android Studio安装部署系列】十九、Android studio使用SVN
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 在AndroidStudio中开发版本控制,除了Git就是SVN,和Eclipse不同,Android Studio没有提供单独的插 ...
- 【Android Studio探索之路系列】之四:Android Studio快捷键
作者:郭孝星 微博:郭孝星的新浪微博 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells github:https://github.co ...
- 用较新版本的Android Studio Chipmunk编译旧版本的Android 21的Sample
技术发展这么快,经常遇到需要使用新版本的Android Studio来开发运行旧的Android工程,此时需要处理gradle兼容的问题 问题一.Could not install Gradle di ...
- android studio 远程调试,Unity3D学习笔记——Android远程真机调试(Unity Remote)
前言:当使用Unity开发移动端的游戏,特别是使用到手机的传感器,如重力感应等,调试的时候,很麻烦, 因为每次都需要编译成APK后安装到手机中测试,而Unity Remote便能很好的解决这个问题,U ...
- access中的android sdk,Android Studio报错unable to access android sdk add-on list解决方案
一.问题 初次安装Android Studio,启动后,报错如下: unable to access android sdk add-on lis 如图: 二.原因 AS启动后,会在默认路径下检测是否 ...
- android studio device功能,Android Studio 3.0找不到Android Device Monitor
因为自Android Studio 3.0开始弃用Android Device Monitor,Android Developers官网上的原话是: Android Device Monitor is ...
- Android Studio同步失败设置代理,Android Studio如何设置代理?
由于使用Android Studio期间,很多时候都要访问谷歌官方服务器,但是由于一些其他原因,会导致连接不上或者速度很慢,那就需要我们设置一下国内的镜像代理了.下面,让我们一起来看看Android ...
最新文章
- 风变python小课离线版_Python是个什么鬼?为什么医学生朋友圈里都是它!
- VS2005代码格式化
- 基于Spring Security的认证授权_认证原理_授权流程_Spring Security OAuth2.0认证授权---springcloud工作笔记126
- 欲学机器学习必先掌握Shell,AI工程师自制教程,获Reddit网友400+点赞 | PDF+视频...
- Silverlight 游戏开发“.NET研究”小技巧:血条和进度条
- 信息技术手册查重错误比对分析程序开发记录3
- 第一个Maven工程的目录结构和文件内容及联网问题
- Arduino学习笔记:基于LiquidCrystal库运行LCD1602
- AtomicReference使用场景
- Hadoop(八)网站流量分析
- 微信公众号开发:Java后台如何处理公众号关注和取关事件
- 暴雪娱乐-魔兽世界:地下城的环境艺术
- 中国首枚NFC邮票发行背后,NFC技术的“有限性”创新
- linux上如何搭建Java环境
- mysql doesn t exist_Mysql的“Table 'mysql.servers' doesn't exist”的解决方法
- CSU2020期中测试模拟题1 问题E:小帅的字符串
- 网络容易丢包情况汇总
- 【教程】在Radmixture运行无标杆成分名的任意祖源计算器的方法
- java仿QQ微信聊天室
- 线性代数复习归纳(一):矩阵+例题
热门文章
- 多路复用输入/输出 ---- select
- POJ 3250:Bad Hair Day 好玩的单调栈
- Apache Prefork、Worker和Event三种工作模式分析
- JQuery中操作Css样式
- Python 2.7的新特性
- 看mysql手册中模式(SQL_MODE)学到的知识
- linux 后台进程管理,Linux 后台进程管理利器 Supervisor
- 百元百鸡 //构造结构体变量
- mysql损坏打不开_mysql 断电导致表打不开解决方案
- android中的actionbar,android中开启actionbar的两种方法