Android之Context理解

Application的Context是一个全局静态变量,SDK的说明是只有当你引用这个context的生命周期超过了当前activity的生命周期,而和整个应用的生命周期挂钩时,才去使用这个application的context。

一种推荐的用法就是应用程序注册广播broadcast时,使用这个context。

引用application context并不会导致内存泄漏。引用activity的context才会导致内存泄漏,当你的引用对象的生命周期超过了当前activity的生命周期时,系统回收你的activity时发现还有一个context的强引用,而不去销毁这个activity,导致内存泄漏,在开发过程中,需要非常重视这点(一个全局静态变量在引用context时一定要使用application的Context, 而不要使用activity的)

什么是Content

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

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

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

信息 等。。

 

应用程序创建Context实例的情况有如下几种情况:

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

2、创建Service对象时

3、创建Activity对象时

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

 

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


 

 

具体创建Context的时机

 

1、创建Application对象的时机

 

每个应用程序在第一次启动时,都会首先创建Application对象。如果对应用程序启动一个Activity(startActivity)流程比较

清楚的话,创建Application的时机在创建handleBindApplication()方法中

2、创建Activity对象的时机

 

通过startActivity()或startActivityForResult()请求启动一个Activity时,如果系统检测需要新建一个Activity对象时,就会

回调handleLaunchActivity()方法,该方法继而调用performLaunchActivity()方法,去创建一个Activity实例,并且回调

onCreate(),onStart()方法等。

3、创建Service对象的时机

 

通过startService或者bindService时,如果系统检测到需要新创建一个Service实例,就会回调handleCreateService()方法,

完成相关数据操作。

 还有就是,在使用context的时候,小心内存泄露,防止内存泄露,注意一下几个方面:

1. 不要让生命周期长的对象引用activity context,即保证引用activity的对象要与activity本身生命周期是一样的

2. 对于生命周期长的对象,可以使用application context

3. 避免非静态的内部类,尽量使用静态类,避免生命周期问题,注意内部类对外部对象引用导致的生命周期变化

现在回到正题,说一下android全局变量,在平时的开发过程中,有时候可能会需要一些全局数据,来让应用中的所有Activity和View都能访问到,大家在遇到这种情况时,可能首先会想到自己定义一个类,然后创建很多静态成员,android已经为我们提供了这种情况的解决方案:

在Android中,有一个Application类,在Activity中可以使用getApplication()方法获得实例,使用它就可以获得当前应用的主题、资源文件中的内容等,这个类更灵活的一个特性就是可以被继承,来添加自己的全局属性.


你可能感兴趣的:(android)