美文网首页
Android-context

Android-context

作者: 书虫大王X | 来源:发表于2021-06-27 23:25 被阅读0次

    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的方式:

    1. getApplicationContext() :
      这个函数返回的这个Application的上下文,所以是与app挂钩的,所以在整个生命周期里面都是不变的,这个好理解,但是使用的时候要注意,该context是和引用的生命周期一致的,所以和activity生命周期挂钩的任务不要使用该context,比如网络访问,防止内存泄露
    2. getBasecontext():
    3. getApplication():
      getApplication只能被Activity和Services使用,虽然在现在的Android的实现中,getApplication和getApplicationContext返回一样的对象,但也不能保证这两个函数一样(例如在特殊的提供者来说),所以如果你想得到你在Manifest文件里面注册的App class,你不要去调用getApplicationContext,以为你可能得不到你所要的app实例
    4. getParent() :
      返回activity的上下文,如果这个子视图的话,换句话说,就是当在子视图里面调用的话就返回一个带有子视图的activity对象
    5. getActivity() :
      在fragment中使用,返回该fragment所依附的activity上下文
    6. this:
      记住Activity,Service类,Application类是继承自Context类的,所以在有的时候需要上下文,只需要使用this关键字即可,但是有的时候再线程里面,this关键字的意义就改变了,但这个时候如果需要上下文,则需要使用 类名.this,这样就可以了

    相关文章

      网友评论

          本文标题:Android-context

          本文链接:https://www.haomeiwen.com/subject/dtvkfltx.html