1、context描述的是一个应用程序环境的信息,即上下文。是一个抽象类,它的实现由Android系统提供。通过它我们可以获取应用程序的资源和类,也包括一些应用级别操作,例如:启动一个Activity,发送广播,接受Intent信息 等
2、它是应用程序和系统之间的桥梁,应用程序访问系统各种资源的接口。
3、那context是从哪里来的?AMS!AMS是系统级进程,拥有访问系统级资源和操作的权利,应用程序的启动受AMS的调控,在程序启动的过程中,AMS会把一个“凭证”通过跨进程通信给到应用程序,程序会把这个“凭证”封装成context,并提供一系列的接口,这样我们的程序也就可以很方便地访问系统资源了。这样的好处是:系统可以对应用程序级的操作进行调控,限制各种情景下的权限,同时也可以防止恶意攻击。
4、Context抽象类,他定义了一系列与系统交汇的接口。ContextWrapper继承自Context,但是并没有真正实现Context中的接口,而是把接口的实现都托管给ContextImpl,ContextImpl是Context接口的真正实现者,从AMS拿来的“凭证”也是封装到了ContextImpl中,然后赋值给ContextWrapper,这里运用到了一种模式:装饰者模式。Application和Service都继承自ContextWrapper,那么他们也就拥有Context的接口方法且本身即是context,方便开发者的使用。Activity比较特殊,因为它是有界面的,所以他需要一个主题:Theme,ContextThemeWrapper在ContextWrapper的基础上增加与主题相关的操作。
5、Application是全局Context,整个应用程序只有一个,他可以访问到应用程序的包信息等。
6、深入讲解:android context讲解
7、AMS功能概述:
- 管理组件状态:包括四大组件的开启,关闭等一系列操作。如startActivity,startActivityAndWait,activityPaused,startService,stopService,removeContentProvider等
- 组件状态查询:查询组件当前运行等情况。如getCallingActivity,getService等
- Task相关:包括removeTask,removeSubTask,moveTaskBackwards,moveTaskToFront等
8、AMS(ActivityManagerService)的启动是在SystemServer进程中启动的,它的职责是用于和所有APP的四大组件进行通信,Activity的启动过程就是APP端与AMS端进行通信,首先理解的一点是APP端与AMS是在两个不同的进程中,因此APP端与AMS是通过跨进程通信
- ActivityManagerService在android中主要的作用有二部分:
(1) activity栈管理
(2) 消息分发
9、init进程是Android系统中的初始化进程,init生成Zygote进程,Android中大多数应用进程和系统进程都是通过Zygote进程生成的。
10、Context数量 = Activity数量 + Service数量 + 1
11、获取context的方式:
- getApplicationContext() :
这个函数返回的这个Application的上下文,所以是与app挂钩的,所以在整个生命周期里面都是不变的,这个好理解,但是使用的时候要注意,该context是和引用的生命周期一致的,所以和activity生命周期挂钩的任务不要使用该context,比如网络访问,防止内存泄露- getBasecontext():
- getApplication():
getApplication只能被Activity和Services使用,虽然在现在的Android的实现中,getApplication和getApplicationContext返回一样的对象,但也不能保证这两个函数一样(例如在特殊的提供者来说),所以如果你想得到你在Manifest文件里面注册的App class,你不要去调用getApplicationContext,以为你可能得不到你所要的app实例- getParent() :
返回activity的上下文,如果这个子视图的话,换句话说,就是当在子视图里面调用的话就返回一个带有子视图的activity对象- getActivity() :
在fragment中使用,返回该fragment所依附的activity上下文- this:
记住Activity,Service类,Application类是继承自Context类的,所以在有的时候需要上下文,只需要使用this关键字即可,但是有的时候再线程里面,this关键字的意义就改变了,但这个时候如果需要上下文,则需要使用 类名.this,这样就可以了
网友评论