zoukankan      html  css  js  c++  java
  • ContextImpl简单解析

    ContextImpl是对Context的一个具体实现类,关键方法如下

     1 static class ServiceFetcher {
     2         int mContextCacheIndex = -1;
     3         /**
     4          * Main entrypoint; only override if you don't need caching.
     5          */
     6         public Object getService(ContextImpl ctx) {
     7             ArrayList<Object> cache = ctx.mServiceCache;//mServiceCache是ArrayList<Object>类型对象 
     8             Object service;
     9             synchronized (cache) {
    10                 if (cache.size() == 0) {
    11                     // Initialize the cache vector on first access.
    12                     // At this point sNextPerContextServiceCacheIndex
    13                     // is the number of potential services that are
    14                     // cached per-Context.
    15                     for (int i = 0; i < sNextPerContextServiceCacheIndex; i++) { // sNextPerContextServiceCacheIndex为每个Android服务的索引值 
    16                         cache.add(null);//添加null对象
    17                     }
    18                 } else {// size不为0的时候,即,之前已经调用过getSystemService 
    19                     service = cache.get(mContextCacheIndex);
    20                     if (service != null) {
    21                         return service;
    22                     }
    23                 }
    24                 service = createService(ctx); // cache.size=0并且已经添加了一个null对象到cache里 
    25                 cache.set(mContextCacheIndex, service); // 设置新创建的服务添加到cache里 
    26                 return service;
    27             }
    28         }

    在getService中先获取当前的服务,保存在cache(缓存)中,首先去注册服务, sNextPerContextServiceCacheIndex就是你注册服务的数量

    对于一个新创建的Activity,ctx.mServiceCache中没有元素,此时cache.size() = 0,为cache中添加null对象,再创建一个服务给这个个新创建的Activity,对于一个不是新的Activity来说,找到之前 cache中的索引,返回service

     1        /**
     2          * Override this to create a new per-Context instance of the
     3          * service.  getService() will handle locking and caching.
     4          */
     5         public Object createService(ContextImpl ctx) {
     6             throw new RuntimeException("Not implemented");
     7         }
     8     }
     9     /**
    10      * Override this class for services to be cached process-wide.
    11      */
    12     abstract static class StaticServiceFetcher extends ServiceFetcher {
    13         private Object mCachedInstance;
    14 
    15 
    16         @Override
    17         public final Object getService(ContextImpl unused) {
    18             synchronized (StaticServiceFetcher.this) {
    19                 Object service = mCachedInstance;
    20                 if (service != null) {
    21                     return service;
    22                 }
    23                 return mCachedInstance = createStaticService();
    24             }
    25         }
    26 
    27 
    28         public abstract Object createStaticService();
    29     }
    30 
    31 
    32     private static final HashMap<String, ServiceFetcher> SYSTEM_SERVICE_MAP =
    33             new HashMap<String, ServiceFetcher>();
    34 
    35 
    36     private static int sNextPerContextServiceCacheIndex = 0;
    37     private static void registerService(String serviceName, ServiceFetcher fetcher) {
    38         if (!(fetcher instanceof StaticServiceFetcher)) {
    39             fetcher.mContextCacheIndex = sNextPerContextServiceCacheIndex++;
    40         }
    41         SYSTEM_SERVICE_MAP.put(serviceName, fetcher);
    42     }


    注册的服务有:

       1、AccessibilityManagerService-> AccessibilityManager 这块可能要仔细看一下,主要是一些View获得点击、焦点、文字改变等事件的分发管理,对整个系统的调试、问题定位等,也需要最这个服务仔细过目一下。

     2、AccountManagerService -> AccountManager 关于系统的用户,密码和管理权限的服务

    3、ActivityManagerService->ActivityManager 这个是整个Android framework框架中最为核心的一个服务,管理整个框架中任务、进程管理, Intent解析等的核心实现。虽然名为Activity的Manager Service,但它管辖的范围,不只是Activity,还有其他三大组件,和它们所在的进程。也就是说用户应用程序的生命管理,都是由他负责的。

    4、AlarmManagerService -> AlarmManager 闹钟服务程序

    5、AudioService -> AudioManager AudioFlinger的上层管理封装,主要是音量、音效、声道及铃声等的管理

    6、MediaRouter 媒体流的服务

    7、BluetoothService -> BluetoothDevice 蓝牙的后台管理和服务程序

    8、ClipboardService -> ClipboardManager 和其他系统的clipBoard服务类似,提供复制黏贴功过。

    9、ConnectivityService -> ConnectivityManager 网络连接状态服务,可供其他应用查询,当网络状态变化时,也可广播改变。

    10、CountryDetector

    11、DevicePolicyManager

    12、DOWNLOAD_SERVICE->DownloadManager 下载服务

    13、NFC_SERVICE NFC服务,10cm以内的无线通信,允许电子设备之间进行非接触式点对点数据传输,实现信息交换、内容访问、服务交互

    14、DROPBOX_SERVICE 用于生成和管理系统运行时的一些日志文件

    15、INPUT_SERVICE 输入输出设备的服务,像鼠标,触摸,键盘等操作

    16、DISPLAY_SERVICE 显示服务

    17、INPUT_METHOD_SERVICE 输入法的服务,与EditText的交互

    18、TEXT_SERVICES_MANAGER_SERVICE 文本信息管理的服务,包括信息的检索等等

    19、KEYGUARD_SERVICE 屏幕的亮屏、解锁、锁定等相关服务

    20、LAYOUT_INFLATER_SERVICE 载入layout中xml的文件

    21、LOCATION_SERVICE 本地GPS定位服务

    22、NETWORK_POLICY_SERVICE 网络策略服务

    23、NotificationManagerService  -> NotificationManager 负责管理和通知后台事件的发生等,这个和statusbar胶黏在一起,一般会在statusbar上添加响应图标。用户可以通过这知道系统后台发生了什么事情。

    24、NSD_SERVICE 服务发现协议

    25、PowerManagerService –> PowerManager Android 的电源管理也是很重要的一部分。比如在待机的时候关掉不用的设备,待机时屏幕和键盘背光的关闭,用户操作的时候该打开多少设备等等。

    26、SearchManagerService -> SearchManager 搜索管理服务,发送搜索UI,并且维护注册搜索的Activity

    27、SensorService -> SensorManager 管理Sensor(传感器)设备的服务,负责注册client设备及当client需要使用sensor时激活Sensor

    28、STATUS_BAR_SERVICE 状态栏服务

    29、STORAGE_SERVICE SD卡的服务

    30、TELEPHONY_SERVICE

    31、THROTTLE_SERVICE

    32、UI_MODE_SERVICE

    33、USB_SERVICE

    34、SERIAL_SERVICE

    35、VIBRATOR_SERVICE

    36、WALLPAPER_SERVICE

    37、WIFI_SERVICE

    38、WIFI_P2P_SERVICE

    39、WindowManagerService -> WindowManager -> PhoneWindowManager

    和ActivityManagerService高度粘合,窗口管理,这里最核心的就是输入事件的分发和管理。

    40、USER_SERVICE

     

     

     

     

     

     

     

     

    获取应用程序的信息,像包名、主线程的Looper、Theme、文件路径、contentResolver、SQLitedatabase

    重写了Context.java中的接口,实现了Activity的启动关闭,Sendboardcast(消息的广播、接收)、Service的启动关闭、绑定,系统运行时的文件、权限的增加(grant)、检查(check)、删除(revoke)

     

    ContextWarpper是对Context的封装,ContextThemeWarpper在ContextWarpper的基础上增加了Theme的封装。

  • 相关阅读:
    kafka 0.10.2 cetos6.5 集群部署
    zookeeper3.4.9 centos6.5 集群安装
    centos6.5 scala环境变量
    用易语言写个简单的小爬虫其中的关键点
    MYSQL错误码2059解决办法
    python随机生成经纬度(用于爬虫参数伪造)
    frida框架hook获取方法输出参数(常用于简单的so输出参数获取,快速开发)
    安卓日常开发和逆向中常用的shell命令与非shell命令
    从了解机器学习开始
    numpy的使用方法
  • 原文地址:https://www.cnblogs.com/nick-zhang/p/3804572.html
Copyright © 2011-2022 走看看