完全解析
详解
Context 介绍
Android 程序与Java程序都是用Java语言编写的,但最大的区别是,java随便一个类,在main()方法中就能跑了,但Android需要完整的Android环境,有Activity、Service、BroadcastReceiver、Content Provider等组件,这些不是像Java中的类,new一下就可以用的,它们需要各自的上下文环境,所以就需要Context。
Context的功能
如图,Context分为三种类型,Appliaciton、Service、Activity。具体功能包括弹出Toast、启动Activity、启动Service、发送广播、操作数据库等。通常状况下,三种类型的Context都可以进行通用,但又两种场景下需要使用特定的Context,①启动Activity.②弹出Dialog。原因:由于Android不允许Activity与Dialog凭空出现,Activity的启动需要启动在另一个Activity之上,以此形成返回栈。Dialog的显示需要在Activity中。所以,此时的Context需要Activity类型的Context。
一个应用中Context的数量
Context数量 = Service数量+Activity数量+1(Application数量)
不同场景使用Context
①:Dialog中使用Context,需要使用Activity.this的context,因为Dialog需要依附于Activity存在。
②:工具类中使用Context,需要使用的是getApplicationContext(),因为如果使用Activity的Context,则如果actiivty销毁,而工具类还持有引用,可能造成空指针异常。
③:如果是需要在当前View中显示,view结束则不会再显示,则无须使用全局,使用本地的Activity/VIew的Context即可。
Context的正确姿势:
1:当Application的Context能搞定的情况下,并且生命周期长的对象,优先使用Application的Context。
2:不要让生命周期长于Activity的对象持有到Activity的引用。
3:尽量不要在Activity中使用非静态内部类,因为非静态内部类会隐式持有外部类实例的引用,如果使用静态内部类,将外部实例引用作为弱引用持有。
转自:https://www.jianshu.com/p/94e0f9ab3f1d
Application 介绍
用途:初始化全局变量。
介绍:Application一个应用只有一个,生命周期为一个应用的开启到结束,本身是系统组件,已经为一个单例,无须再进行创建单例。
官方也不建议使用子类继承Application,但通常大家都自定义自己的Application,也无没什么不妥之处。
正确的单例用法:
使用
在Manifest.xml中声明,android:name=".xxx"
常见的Appliaction的Context
有图可知,在需要使用context的时候,需要在attachBaseContext之后进行使用,这样context才进行初始化完成,才可以使用通用的getPackageName()、getService()等操作,否则会造成空指针异常。
getApplicaiton()与getApplicationContext()的区别
getApplicaiton()与getApplicationContext()获取的对象都是同一对象,但getApplicationContext()的作用域更广一些,例如,在BroadReceiver中,只能调用到getApplicationContext()。
结果: