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. react 配置ant时遇见的一个Error: Multiple configuration files found. Please remove one: – package.json#babel – .babelrc 解决方案

    这个问题是create react app 里面的package.json里面已经配置了   "babel": {     "presets": [       ...

  2. 小程序mpvue中动态切换echarts图表

    如果你用mpvue,而且还想用echarts,那么这个包你可以以来一下 https://github.com/F-loat/mpvue-echarts 考虑到多个页面都休要用,所以抽出来作为一个组件, ...

  3. linux 互斥量

    互斥量(mutex)从本质上来说是一把锁,在访问共享资源前对互斥量进行加锁,在访问完后释放互斥量上的锁. 对互斥量进行加锁以后,任何其他试图再次对互斥量加锁的线程都将会被阻塞直到当前线程释放该互斥锁. ...

  4. VMware 虚拟化编程(7) — VixDiskLib 虚拟磁盘库详解之三

    目录 目录 前文列表 VixDiskLib 虚拟磁盘库 VixDiskLib_GetMetadataKeys VixDiskLib_ReadMetadata 获取虚拟磁盘元数据 VixDiskLib_ ...

  5. 大数据架构师必读的NoSQL建模技术

    大数据架构师必读的NoSQL建模技术 从数据建模的角度对NoSQL家族系统做了比较简单的比较,并简要介绍几种常见建模技术. 1.前言 为了适应大数据应用场景的要求,Hadoop以及NoSQL等与传统企 ...

  6. Flink流式引擎技术分析--大纲

    Flink简介 Flink组件栈 Flink特性 流处理特性 API支持 Libraries支持 整合支持 Flink概念 Stream.Transformation.Operator Paralle ...

  7. python程序的模块与包

    python的程序是由模块组成的,一个python文件就是一个模块,而模块一般由代码,函数,或者类组成.创建baiduHq.py模块(文件),在该模块中编写变量,函数,类,来说明在一个模块中,变量的输 ...

  8. 【ABAP系列】SAP ABAP POPUP弹出框自建内容

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP ABAP POPUP弹出框自 ...

  9. 工具 - MSF

    #ms17- use auxiliary/scanner/smb/smb_ms17_010 - exploit use exploit/windows/smb/ms17_010_eternalblue ...

  10. ios平台appstore不支持网页内嵌app解决方案

    苹果一直拒绝 UIWebView 内嵌 HTML5 页面的 iPhone.iPad APP应用上架到 App Store,建议这样的APP去做成Safari的Web应用.但是,苹果的审核人员只从界面. ...