新用户注册入口 老用户登录入口

[转载]android studio for android learning (二十 )android中this、context等关键概念理解全解

文章作者:转载 更新时间:2023-09-27 17:37:26 阅读数量:92
文章标签:thisJavaAndroidContext内部类实例引用
本文摘要:本文详细探讨了Java中`this`关键字在Android开发环境中的具体应用,特别是在Activity、内部类如OnClickListener以及Context的上下文中。通过实例分析,明确了`MainActivity.this`和`TextC.this`等表达式的含义,指出它们分别代表各自类对象的引用,并强调在内部类中使用`this`时需注意其指向。同时深入剖析了Android系统中的Context机制,包括Context家族的关系及源码实现,说明Context作为应用环境上下文接口的重要性,及其在启动Activity、Service等组件时的作用。最后总结了应用程序中共有的Context实例数量计算方式,涉及的关键概念有:this、Android、Context、Activity、内部类、OnClickListener、MainActivity、实例引用、ContextImpl等。
转载文章

本篇文章为转载内容。原文链接:https://blog.csdn.net/yywan1314520/article/details/51953172。

该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。

作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。

如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。

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研究的朋友可以加入下面的群或是关注下面的微信公众号

这里写图片描述这里写图片描述

本篇文章为转载内容。原文链接:https://blog.csdn.net/yywan1314520/article/details/51953172。

该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。

作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。

如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。

相关阅读
文章标题:[转载][洛谷P1082]同余方程

更新时间:2023-02-18
[转载][洛谷P1082]同余方程
文章标题:[转载]webpack优化之HappyPack实战

更新时间:2023-08-07
[转载]webpack优化之HappyPack实战
文章标题:[转载]oracle 同时更新多表,在Oracle数据库中同时更新两张表的简单方法

更新时间:2023-09-10
[转载]oracle 同时更新多表,在Oracle数据库中同时更新两张表的简单方法
文章标题:[转载][Unity] 包括场景互动与射击要素的俯视角闯关游戏Demo

更新时间:2024-03-11
[转载][Unity] 包括场景互动与射击要素的俯视角闯关游戏Demo
文章标题:[转载]程序员也分三六九等?等级差异,一个看不起一个!

更新时间:2024-05-10
[转载]程序员也分三六九等?等级差异,一个看不起一个!
文章标题:[转载]海贼王 动漫 全集目录 分章节 精彩打斗剧集

更新时间:2024-01-12
[转载]海贼王 动漫 全集目录 分章节 精彩打斗剧集
名词解释
作为当前文章的名词解释,仅对当前文章有效。
this关键字在Java编程语言中,"this"是一个引用变量,它始终指向当前对象的引用。在Android开发环境下,"this"通常用来引用当前类的实例,它可以调用该类的成员变量和非静态方法。例如,在文章中提到,当我们在一个内部类(如OnClickListener)中使用"this"时,其默认指向内部类自身,而非外部的Activity类;若要引用外部类,则需要写出外部类名.this。
Context在Android系统中,"Context"是一个抽象接口,它提供了与应用程序环境相关的信息和全局服务访问入口。通过Context,开发者可以获取应用资源、启动Activity、发送广播、接收Intent等操作。实际运行时,系统为每个应用程序提供了一个或多个Context的具体实现类实例,如ContextImpl。在文章中详细分析了Context家族的关系以及源码实现,表明Context是Android开发中不可或缺的核心概念之一。
OnClickListener在Android UI开发中,"OnClickListener"是一个接口,它是Android SDK中定义的一个监听器接口,用于处理用户对UI组件(如Button、TextView等)的点击事件。当我们将一个实现了OnClickListener接口的对象设置给UI组件的setOnClickListener()方法时,当用户点击该组件时,将会回调我们实现的onClick()方法。例如,文章中的代码片段展示了如何创建一个匿名内部类来实现OnClickListener接口,并在onClick()方法中利用"this"关键字来正确引用外部的Activity上下文环境。
延伸阅读
作为当前文章的延伸阅读,仅对当前文章有效。
在深入理解了Java中`this`关键字在Android开发中的具体应用以及Android系统中Context机制之后,开发者们可以进一步关注以下几方面的
首先,对于Android开发的新动态,Google在Android 12版本中对Context的使用引入了一些新特性与优化。例如,为了提高隐私和安全,限制了通过Context获取设备信息的能力,要求开发者更明确地声明权限。此外,针对Context的生命周期管理,Google也推出了一些最佳实践指南,以帮助开发者更好地遵循架构组件设计原则,避免内存泄漏等问题。
其次,深入探究Android组件间的交互方式,尤其是Activity、Service和BroadcastReceiver等组件如何通过Context进行通信,是提升Android开发技能的重要一环。近期有关消息传递机制(如Jetpack库中的WorkManager、LiveData)的博客文章和技术分享,能为开发者提供更加高效且符合现代Android架构规范的Context使用范例。
再者,从设计模式角度解读Context在MVC、MVP、MVVM等不同架构中的角色转变,有助于理解其在整个应用架构中的核心地位。一些经典的软件设计书籍和专家解析文章对此有独到见解,值得深入研读。
最后,结合实际项目案例分析,了解大型项目中Context的最佳实践及常见问题处理方案。许多技术社区和开源项目会分享他们在处理多模块间Context共享、Context引用导致的内存泄漏等问题时的具体解决方案和经验总结,这对于开发者来说具有极高的实战参考价值。
知识学习
实践的时候请根据实际情况谨慎操作。
随机学习一条linux命令:
free -h - 显示内存使用情况。
随便看看
拉到页底了吧,随便看看还有哪些文章你可能感兴趣。
HessianRPC在高负载下服务降级与熔断器模式保障用户体验 05-01 jQuery和TweenMax简单实用的水平手风琴特效 01-20 jquery选择国家下拉列表框插件 01-21 Sqoop在Hadoop集群中的数据传输机制及数据库迁移、收集与备份恢复应用实践 12-23 简约渔具批发牧渔企业类网站前端模板下载 11-09 基于bootstrap功能齐全的jQuery进度条插件 10-20 简约大气男性护肤产品HTML5网站模板 09-22 宽屏大气机械设备制造公司网站模板 08-13 演讲会门票销售网站模板下载 07-30 本次刷新还10个文章未展示,点击 更多查看。
经典响应式投资理财企业前端模板 06-26 基于Redis的键值对存储实现用户阅读状态跟踪与管理 06-24 Netty框架中CannotFindServerSelection异常:服务器地址配置错误与通道类型匹配详解 06-18 简洁设计公司响应式网站模板下载 05-06 绿色苗木草坪种植绿化类企业前端CMS模板下载 04-30 怎么在cmd开启mysql服务 04-15 保洁公司家庭保洁服务网站模板 03-26 SpringCloud微服务中分布式锁的死锁问题与状态一致性维护:避免循环依赖、公平锁及超时重试机制在Redisson中的实践运用 03-19 HBase性能测试与RegionServer配置、架构及数据模型调优实践:关注响应时间、并发处理能力与BlockCache优化 03-14 jquery控制radio触发事件 02-15 简约HTML5软件营销业务公司网站模板 02-09
时光飞逝
"流光容易把人抛,红了樱桃,绿了芭蕉。"