一.Context的作用

Context的最大作用就是我们可以通过传递它来获得其他Activity或Application的相关资源和方法,它就相当于它们的引用,我们通过引用来获得对象的封装,这也是我们面向对象的基础,所以,我们主要利用它来加载和访问资源。

二 .Context的类型
     Context的类型有两种,一种是Activity-Context,另一种是Application-Activity,这两种的区别就在于它们的生命周期不一样,一个是随着Activity的销毁而销毁,另一个是伴随整个Application,鉴于我们以前学习java,C++这些语言的经验,都会意识到,这些生命周期的不同可能会导致不同行为以及一些错误,这些都会在接下来讲到,因为它们是我们使用Context必须注意的。
1.Application-Context
   这个之所以先讲,是因为这个比较麻烦,在于它的获取需要通过一些手段。
   Application-Context的生命周期是整个应用,所以,对于它的使用必须慎重,大部分情况下都要避免使用它,因为它会导致内存泄露的问题。我们先来举个例子,如果我们现在在一个Activity中引入一个Application-Context,那么,当我们这个Activity关闭的时候,这个Application-Context是不会消失的,因为它的生命周期要比我们的Activity长,如果只是一些用来计算的数据还好,但是如果这个Context与我们的Activity的创建有关,或者与我们在Activity要销毁的资源比如图片资源有关,那么,问题就大条了!因为我们的Activity或图片就不能正常销毁,因为它与Application-Context相关联,如果不能正常的释放掉与它们相关的内存,就会出现所谓的内存泄露的问题。这种问题有时候是非常隐晦的,以至于我们根本无法察觉到,所以我们必须遵守相关的使用原则。
 要想获得Application-Context,我们可以先声明一个Application的子类。

class A extends Application{}

现在,我们在这个类中添加一些东西来证明可以通过Context来获得A的相关资源和方法。这次我们使用一个Toast。

首先,是在我们的类A里添加以下的内容:

      String s = "hello";
public String getString(String str){
s = str;
return s;
}

然后再在我们的Activity B中尝试取用A的数据和方法:

       A a = (A)getApplicationContext();
String s = a.s;
s = a.getString("hello word");
Toast.makeText(this, s, Toast.LENGTH_LONG).show();

然后我们还必须注意在我们的mainfest文件中注册我们的application:

 <application android:name=".A"></application>
注意,我们的mainfes开始的at文件中一开pplication是没有名字的,因为我们一般都只是启动一个Activity,而不是一个application,所以,可以将我们这个application的名字注册为继承自Application的子类A,这样才能正常显示出一个Toast出来。如果没有这么做,就可能报出这样的错误:android.app.Application cannot be cast to A
2.Activity-Context
      正如上面讲的一样,这个Context的生命周期是和得到它的引用的Activity一样长,如果这个Activity结束了,那么,这个Context也会得到释放。它并不像我们上面的Application-Context需要特意去获得,可以在一个Activity中使用this就可以获得当前Activity的Context。还是拿上面例子中的Toast.makeText(this, s, Toast.LENGTH_LONG).show(),其中的this就是当前的Activity-Context,但是,一味的使用this是很危险的,我们要注意的就是,在匿名内部类如果单纯只是使用this是会出错的,因为内部类中使用this得到的是内部类的对象引用,而不是我们要得到的外部类的引用,于是,这时候就必须使用类名.this这种方式,这种做法在按钮的事件监听中是特别要注意的。
 3.使用规则
     因为使用Application-Cntext会出现内存泄露的危险,所以我们一般都是使用Activity-Context。下面就是这两者的使用规则:
    (1)不要让生命周期长的对象引用Activity-Context,保证引用要与Ativity本身生命周期是一样的,对于生命周期长的对象,使用Application-Context 。
     如果你想要在某个Activity的界面上显示某个组件,比如说Toast,那么,请把你的Activity的Context作为参数传给Toast,这样就能将你的Activity和Toast关联起来,但是,如果你想要在一个Activity中设置好你的Toast,然后再在另一个Activity中显示,记住,你可以有两种选择,一种,就是通过我们的Intent:

      Intent intent = new Intent(Activity1.this, Activity2.class);
startActivity(intent);

这个Activity1就是我们要显示Toast的Activity,而Acticity2就是我们设置Toast的Activity。

      但是,如果想要在Activity1中调用Toast.show(),接受Activity2中返回的Toast的话,那么,使用默认的样式是非常简单的,如果你真的想要使用自定义的格式,自定义一个布局文件Toast.xml,那么,请在你的Activity1中写下这几句:

      LayoutInflater layout = getLayoutInflater();
View view = layout.inflate(R.layout.toast, null);

记住,必须是在setContentView()之后进行切换,不然就会报错,而且,必须是在你要显示的Activity的setContentView(),如果你放在Activity2中的setContentView()也是会出错,就是空指针,因为我们的layout的元素只有在setContentView()之后才开始分配内存,而且我们只是调用Activity2的方法而已,并没有启动Activity2,这点必须注意。

Context的正确使用的更多相关文章

  1. 移动端微信小程序开发学习报错记录--toast.js:41 未找到 van-toast 节点,请确认 selector 及 context 是否正确

    这个问题仔细检查了一下代码引入,是没有问题的, 根本原因是在页面上忘了加<van-toast id="van-toast" /> 具体引入代码如下: app.json ...

  2. Context Application 使用总结 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  3. Android面试收集录18 Android Context详解

    Activity mActivity =new Activity() 作为Android开发者,不知道你有没有思考过这个问题,Activity可以new吗?Android的应用程序开发采用JAVA语言 ...

  4. Context都没弄明白,还怎么做Android开发?

    Activity mActivity =new Activity() 作为Android开发者,不知道你有没有思考过这个问题,Activity可以new吗?Android的应用程序开发采用JAVA语言 ...

  5. Context都没弄明白,还怎么做Android开发

    转载:https://www.jianshu.com/p/94e0f9ab3f1d Activity mActivity =new Activity() 作为Android开发者,不知道你有没有思考过 ...

  6. 面向侧面的程序设计AOP-------《三》.Net平台AOP技术概览

    本文转载自张逸:晴窗笔记 .Net平台与Java平台相比,由于它至今在服务端仍不具备与unix系统的兼容性,也不具备类似于Java平台下J2EE这样的企业级容器,使得.Net平台在大型的企业级应用上, ...

  7. Android little error records

    1:在清单文件(Manifest)中加入权限时要注意,如下例: <uses-permission android:name="android.permission.CHANGE_NET ...

  8. Linux – RedHat7 / CentOS 7 忘记root密码修改

    1.(a) 开机出现grub boot loader 开机选项菜单时,立即点击键盘任意鍵,boot loader 会暂停. (b) 按下’e’,编辑选项菜单(c) 移动上下鍵至linux16 核心命令 ...

  9. Android 开发 MaterialDialog框架的详解

    前言 开始之前还是需要废话一下,因为有一些坑需要告知.首先MaterialDialog在GitHub上作者已经转型使用100% Kotlin语言编写,虽然可以在Java里调用Kotlin使用.但是个人 ...

随机推荐

  1. Java 中 break和 continue 的使用方法及区别

    break break可用于循环和switch...case...语句中. 用于switch...case中: 执行完满足case条件的内容内后结束switch,不执行下面的语句. eg: publi ...

  2. LINUX-文件系统分析

     badblocks -v /dev/hda1 检查磁盘hda1上的坏磁块 fsck /dev/hda1 修复/检查hda1磁盘上linux文件系统的完整性 fsck.ext2 /dev/hda1 修 ...

  3. 第九节:web爬虫之urllib(五)

    第四个模块 robotparser: 主要是用来识别网站的 robots.txt 文件,然后判断哪些网站可以爬,哪些网站不可以爬的,其实用的比较少.

  4. LINUX应用开发工程师职位(含答案)

    就业模拟测试题-LINUX应用开发工程师职位 本试卷从考试酷examcoo网站导出,文件格式为mht,请用WORD/WPS打开,并另存为doc/docx格式后再使用 试卷编号:143989试卷录入者: ...

  5. springcloud(十一):熔断聚合监控Hystrix Turbine

    springcloud(十一):熔断聚合监控Hystrix Turbine

  6. Ural 1036 Lucky Tickets

    Lucky Tickets Time Limit: 2000ms Memory Limit: 16384KB This problem will be judged on Ural. Original ...

  7. RabbitMQ-高级特性(六)

    存储机制 待... 消息结构 惰性队列 惰性队列会尽可能将消息存入到磁盘中,消费者消费相应的消息才会加载到内存,它可以支持更长的队列 默认情况下生产者消息会尽可能存储到内存中就算设置持久化消息 也会再 ...

  8. python的setdefault

    Python 字典 setdefault() 方法和get()方法类似, 如果键不已经存在于字典中,将会添加键并将值设为默认值. dict.setdefault(key, default=None)

  9. oracle汉字占多少字节问题

    这个其实和Oracle的配置是相关的,用以下语句查询: select * from v$nls_parameters t where t.PARAMETER='NLS_CHARACTERSET'; 可 ...

  10. Cocos2d坐标系具体解释

    1.笛卡尔坐标系 左手坐标系(Direct3D坐标系),右手坐标系(Direct3D坐标系) 大拇指和食指分别相应x轴和y轴 2.UI坐标系 iOS/Android/Windows SDK中的通用UI ...