SystemUI是安卓的一个系统APP,负责的内容有系统通知栏,状态栏,最近应用程序,锁屏,壁纸,屏保,系统对话框,截屏,录屏等功能。

Apk的路径位于/system/priv-app,源码code位于frameworks/base/packages/SystemUI

1.Android.mk

2.AndroidManifest.xml配置文件表明了APP要求的权限,特征以及四大组件。

3.初始化流程

1.SystemUI启动

SystemUI是核心系统应用,需要开机启动,启动SystemUI进程,是通过启动SystemUIService来实现的。
 
 
frameworks\base\services\java\com\android\server\SystemServer.java
 
SystemServer启动后,会在SystemServer Main Thread启动ActivityManagerService,当ActivityManagerService  systemReady后,会去启动SystemUIService。
 
 mActivityManagerService.systemReady(new Runnable() {
            @Override
            public void run() {
           ...
           try {
                    startSystemUi(context);
                } catch (Throwable e) {
                    reportWtf("starting System UI", e);
                }
由如上可以看出,startSystemUi不是在SystemServer Main thread,而是在ActivityManagerService Thread。
 
 static final void startSystemUi(Context context) {
        Intent intent = new Intent();
        intent.setComponent(new ComponentName("com.android.systemui",
                    "com.android.systemui.SystemUIService"));
        //Slog.d(TAG, "Starting service: " + intent);
        context.startServiceAsUser(intent, UserHandle.OWNER);
    }
通过startServiceAsUser,SystemUIService就启动了,即SystemUI进程开机启动。
 
 

2.SystemUI Services启动

SystemServer启动SystemUIService后,会走到SystemUIService的onCreate函数。
public class SystemUIService extends Service {

@Override
    public void onCreate() {
        super.onCreate();
        ((SystemUIApplication) getApplication()).startServicesIfNeeded();
    }

SystemUIService就是一个普通的Service,在onCreate里面,会调用SystemUIApplication的services
 
/**
 * Application class for SystemUI.
 */
public class SystemUIApplication extends Application {

private static final String TAG = "SystemUIService";
    private static final boolean DEBUG = false;

/**
     * The classes of the stuff to start.
     */
    private final Class<?>[] SERVICES = new Class[] {
            com.android.systemui.tuner.TunerService.class,
            com.android.systemui.keyguard.KeyguardViewMediator.class,
            com.android.systemui.recents.Recents.class,
            com.android.systemui.volume.VolumeUI.class,
            com.android.systemui.statusbar.SystemBars.class,
            com.android.systemui.usb.StorageNotification.class,
            com.android.systemui.power.PowerUI.class,
            com.android.systemui.media.RingtonePlayer.class,
    };

 
SystemUIApplication是一个Application实现,重写Application相关函数。
SystemUIApplication定义了很多System Panel,这里叫做SERVICES,但是并非是真正的service.
 
SystemUI应用定义了一个抽象的SystemUI类,根据Java抽象化的特征,可以使开发更加灵活。
 
SystemUI相关的类图关系如下:
从SystemUI继承了很多的Panel,这些Panel有我们很熟悉的,比如Recents(近期任务栏),VolumeUI(音量条),SystemBars(状态栏)等。
 
 
回到SystemUIApplication里的startService函数:
  1. /**
  2. * Makes sure that all the SystemUI services are running. If they are already running, this is a
  3. * no-op. This is needed to conditinally start all the services, as we only need to have it in
  4. * the main process.
  5. *
  6. * <p>This method must only be called from the main thread.</p>
  7. */
  8. public void startServicesIfNeeded() {
  9. if (mServicesStarted) {
  10. return;
  11. }
  12. if (!mBootCompleted) {
  13. // check to see if maybe it was already completed long before we began
  14. // see ActivityManagerService.finishBooting()
  15. if ("1".equals(SystemProperties.get("sys.boot_completed"))) {
  16. mBootCompleted = true;
  17. if (DEBUG) Log.v(TAG, "BOOT_COMPLETED was already sent");
  18. }
  19. }
  20. Log.v(TAG, "Starting SystemUI services.");
  21. final int N = SERVICES.length;
  22. for (int i=0; i<N; i++) {
  23. Class<?> cl = SERVICES[i];
  24. if (DEBUG) Log.d(TAG, "loading: " + cl);
  25. try {
  26. mServices[i] = (SystemUI)cl.newInstance();
  27. } catch (IllegalAccessException ex) {
  28. throw new RuntimeException(ex);
  29. } catch (InstantiationException ex) {
  30. throw new RuntimeException(ex);
  31. }
  32. mServices[i].mContext = this;
  33. mServices[i].mComponents = mComponents;
  34. if (DEBUG) Log.d(TAG, "running: " + mServices[i]);
  35. mServices[i].start();
  36. if (mBootCompleted) {
  37. mServices[i].onBootCompleted();
  38. }
  39. }
  40. mServicesStarted = true;
  41. }
这个函数主要是实例化以及启动SystemUI Services(这里的Service并非是真正的service),这样通过SystemUIService的启动,SystemUI核心的services也启动了。
 
 
在SystemUIApplication类的onCreate里面,会注册开机完成广播,并将开机完成事件,给到SystemUI Services.
  1. @Override
  2. public void onCreate() {
  3. super.onCreate();
  4. // Set the application theme that is inherited by all services. Note that setting the
  5. // application theme in the manifest does only work for activities. Keep this in sync with
  6. // the theme set there.
  7. setTheme(R.style.systemui_theme);
  8. IntentFilter filter = new IntentFilter(Intent.ACTION_BOOT_COMPLETED);
  9. filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
  10. registerReceiver(new BroadcastReceiver() {
  11. @Override
  12. public void onReceive(Context context, Intent intent) {
  13. if (mBootCompleted) return;
  14. if (DEBUG) Log.v(TAG, "BOOT_COMPLETED received");
  15. unregisterReceiver(this);
  16. mBootCompleted = true;
  17. if (mServicesStarted) {
  18. final int N = mServices.length;
  19. for (int i = 0; i < N; i++) {
  20. mServices[i].onBootCompleted();
  21. }
  22. }
  23. }
  24. }, filter);
  25. }

SystemUI Services启动后,根据各Services的功能,SystemUI开始各司其职的正常工作起来。

SystemUI分析的更多相关文章

  1. 第三方apk内置因签名导致SystemUI未启动启动问题案例分析

    这个问题是刷完机正常开机后,发现手机无状态栏,下拉通知栏,按音量键也无法出现VolumeDialog,开始看到这个现象感觉是systemUI未编译到版本中去?或者是在systemserver中syst ...

  2. 【转】android SystemUI 流程分析

    android4 SystemUI 流程分析 什么是SystemUI? 对于Phone来说SystemUI指的是:StatusBar(状态栏).NavigationBar(导航栏).而对于Tablet ...

  3. Android之SystemUI载入流程和NavigationBar的分析

    Android之SystemUI载入流程和NavigationBar的分析 本篇仅仅分析SystemUI的载入过程和SystemUI的当中的一个模块StatusBar的小模块NavigationBar ...

  4. Android8.1 MTK平台 SystemUI源码分析之 网络信号栏显示刷新

    SystemUI系列文章 Android8.1 MTK平台 SystemUI源码分析之 Notification流程 Android8.1 MTK平台 SystemUI源码分析之 电池时钟刷新 And ...

  5. Android8.1 SystemUI源码分析之 电池时钟刷新

    SystemUI源码分析相关文章 Android8.1 SystemUI源码分析之 Notification流程 分析之前再贴一下 StatusBar 相关类图 电池图标刷新 从上篇的分析得到电池图标 ...

  6. Android8.1 SystemUI源码分析之 Notification流程

    代码流程 1.先看UI显示,StatuBar加载 CollapsedStatusBarFragment 替换 status_bar_container(状态栏通知显示区域) SystemUI\src\ ...

  7. Android源码分析(十三)----SystemUI下拉状态栏如何添加快捷开关

    一:如何添加快捷开关 源码路径:frameworks/base/packages/SystemUI/res/values/config.xml 添加headset快捷开关,参考如下修改. Index: ...

  8. Android SystemUI源代码分析和修改

    1.在导航栏中添加音量加减button 一些Android音量调节button.或者从保护实体按键的角度考虑,就须要在导航栏的虚拟按键中加入音量加减调节按键. 效果例如以下图所看到的: 实现步骤例如以 ...

  9. Android ANR 分析解决方法

    一:什么是ANR ANR:Application Not Responding,即应用无响应 二:ANR的类型 ANR一般有三种类型: 1. KeyDispatchTimeout(5 seconds) ...

随机推荐

  1. 网络流小记(EK&dinic&当前弧优化&费用流)

    欢 迎 来 到 网 络 瘤 的 世 界 什么是网络流? 现在我们有一座水库,周围有n个村庄,每个村庄都需要水,所以会修水管(每个水管都有一定的容量,流过的水量不能超过容量).最终水一定会流向唯一一个废 ...

  2. Socket 网络编程实践经验

    目录 目录 相关文章 Socket 与 HTTP 的区别 生产实践考虑 网络断开重连问题 Heartbeat 心跳机制 使用非阻塞模式下的 select 函数进行 Socket 连接检查 会话过期问题 ...

  3. 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_01 Collection集合_6_迭代器的实现原理

  4. Tensorflow创建和读取17flowers数据集

    http://blog.csdn.net/sinat_16823063/article/details/53946549 Tensorflow创建和读取17flowers数据集 标签: tensorf ...

  5. 16/7/8_PHP-正则表达式

    什么叫正则表达式 PCRE库函数中,正则匹配模式使用分隔符与元字符组成,分隔符可以是非数字.非反斜线.非空格的任意字符.经常使用的分隔符是正斜线(/).hash符号(#) 以及取反符号(~),例如: ...

  6. node+express 发送get请求

    var express = require('express') , app = express(); var querystring = require('querystring'); var ut ...

  7. Vuex模块:不开启命名空间

    模块不开启命名空间时,会共享全局命名空间. { state: { 模块1: "局部状态1", 模块2: "局部状态2" }, getters: { getter ...

  8. 解锁 HTTPS原理

    From今日头条:https://www.toutiao.com/a6534826865792647693/?tt_from=weixin&utm_campaign=client_share& ...

  9. 将查询列表内容保存到excel表格中,并保存到相应的盘中

    1.先导入相应的jar包 2.一个小的Demo测试[实体类+测试类:保存excel的方法] Student实体类 public class Student{ private int id; priva ...

  10. 一个阿里云apache服务器配置两个或多个域名forLinux

    一个阿里云apache服务器配置两个或多个域名for Linux: 默认已经配置好了阿里云提供的一键web安装,可以参考:http://www.42iot.com/?id=8 修改/alidata/s ...