Context 和 Applicatin那点事

来源:互联网 发布:永恒之塔5.0人物数据 编辑:程序博客网 时间:2024/06/08 17:01

在项目中经常会进行一些全局的值传递,在某个地方得到了一个参数值,想在另一个地方去使用,一般会写一个类来保存这个值,然后在通过这个类的对象去获取值,但是这样是很危险的做法:1、不能保证对象是不是同一个对象,即使能够做到,实施起来也很困难;2、不确定对象什么时候会被回收,往往会出现NullPointerException,并且不容易查找。在这种情况下Application就显得非常有用。

Application类

Application和Activity,Service一样是Android框架的一个系统组件,当Android程序启动时系统会创建一个Application对象,Android系统自动会为每个程序在运行时创建一个Application类的对象且只创建一个,所以Application可以说是单例(singleton)模式的一个类。通常我们是不需要指定一个Application的,系统会自动帮我们创建,如果需要创建自己的Application,那也很简单!创建一个类继承Application并在AndroidManifest.xml文件中的application标签中进行注册(只需要给application标签增加name属性,并添加自己的 Application的名字即可),这样系统就会初始化我们自己定义的类,而不会初始化默认的Application。

public class MyApplication extends Application {    @Override    public void onCreate() {        super.onCreate();    }}

<application        <span style="color:#33cc00;">android:name=".activity.MyApplication"</span>        android:allowBackup="true"        android:icon="@mipmap/logo"        android:label="@string/app_name"        android:supportsRtl="true"        android:theme="@style/AppTheme">

启动Application时,系统会创建一个PID,即进程ID,所有的Activity都会在此进程上运行。那么我们在Application创建的时候初始化全局变量,同一个应用的所有Activity都可以取到这些全局变量的值,换句话说,我们在某一个Activity中改变了这些全局变量的值,那么在同一个应用的其他Activity中值就会改变。

Application对象的生命周期是整个程序中最长的,它的生命周期就等于这个程序的生命周期。因为它是全局的单例的,所以在不同的Activity,Service中获得的对象都是同一个对象。所以可以通过Application来进行一些,如:数据传递、数据共享和数据缓存等操作。

在Android中,可以通过继承Application类来实现应用程序级的全局变量,这种全局变量方法相对静态类更有保障,直到应用的所有Activity全部被destory掉之后才会被释放掉。

想要获取自己定义的Application,可以通过Context的getApplication方法:

MyApplication myApplication = (MyApplication) getApplication();

但是很多时候我们的代码可能在activity之外,且没有context对象的引用,但是又需要获得AppContext对象,原始的做法

可能是想办法将activity或者context传递到需要调用的地方,但是这样代码耦合度太高,可读性差。我们有更优雅的做法。

我们谈到Application对象是全局的,单例的,既然是单例应该有一个类方法能让我们获得这个单例对象才是,但Application本身没

有,我们只能在自定义的时候想办法。

Application是系统的一个组件,也就有自己的生命周期函数,让人感到意外的是他的生命周期函数中居然也有onCreate(),

我们可以利用这点来获得这个Application对象。

public class MyApplication extends Application {    private static MyApplication instance;    public static MyApplication getInstance() {        return instance;    }    @Override    public void onCreate() {        super.onCreate();        instance = this;    }    }
Context类:

想要详细了解去读两篇文章:

http://blog.csdn.net/lmj623565791/article/details/40481055张鸿洋的博客

http://blog.csdn.net/qinjuning/article/details/7310620


Context是一个场景,代表与操作系统的交互的一种过程。从程序的角度上来理解:Context是个抽象类,而Activity、Service、Application等都是该类的一个实现。

在仔细看一下上图:Activity、Service、Application都是继承自ContextWrapper,而ContextWrapper内部会包含一个base context,由这个base context去实现了绝大多数的方法。

一般我们只需要记住三点:

1、它描述的是一个应用程序环境的信息,即上下文。

        2、该类是一个抽象(abstract class)类,Android提供了该抽象类的具体实现类(后面我们会讲到是ContextIml类)。

        3、通过它我们可以获取应用程序的资源和类,也包括一些应用级别操作,例如:启动一个Activity,发送广播,接受Intent

      信息 等。。

 熟悉了Context的继承关系后,我们接下来分析应用程序在什么情况需要创建Context对象的?应用程序创建Context实例的

 情况有如下几种情况:

      1、创建Application 对象时, 而且整个App共一个Application对象

      2、创建Service对象时

      3、创建Activity对象时

 

    因此应用程序App共有的Context数目公式为:

 

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




0 0
原创粉丝点击