Systemui

顶部、底部和左侧显示固定的区域

SystemUI,顾名思义是系统为用户提供的系统级别的信息显示与交互的一套UI组件,所以其功能包罗万象。比如锁屏、状态栏、底部导航栏、最近使用App列表等,大部分功能相互独立,按需启动。在系统源码中,其位置为:frameworks/base/package/SystemUI。尽管从表现形式上看,SystemUI和普通的Android APP有较大的差别,但其本质和普通APP并没有什么差别,也是以apk的形式存在,会被预置再系统指定的目录

1.systemui启动时机

首先先说下android系统启动流程

  1. 开启电源,执行BootLoader引导程序
  2. BootLoader拉起并且执行Android操作系统
  3. 启动Linux内核,加载系统文件init.rc
  4. 操作系统启动init进程
  5. init启动zygote进程(创建JVM、注册JNI)
  6. zygote进程启动虚拟机,启动SystemService进程
  7. SystemService启动AMS和WMS等各种服务
  8. AMS里面启动Launcher

Systemui作为系统主要进程,则是在SystemService中启动的

SystemServer.java中关键代码如下

private void run() {......// Start services.开启各种Servicetry {traceBeginAndSlog("StartServices");startBootstrapServices();startCoreServices();startOtherServices();SystemServerInitThreadPool.shutdown();} catch (Throwable ex) {throw ex;} finally {traceEnd();}private void startOtherServices() {......mActivityManagerService.systemReady(() -> {Slog.i(TAG, "Making services ready");traceBeginAndSlog("StartActivityManagerReadyPhase");......try {startSystemUi(context, windowManagerF);} catch (Throwable e) {reportWtf("starting System UI", e);}......}
}static final void startSystemUi(Context context, WindowManagerService windowManager) {Intent intent = new Intent();//所以我们在做定制Systemui时,只需将包名和类名设置为如下即可intent.setComponent(new ComponentName("com.android.systemui","com.android.systemui.SystemUIService"));intent.addFlags(Intent.FLAG_DEBUG_TRIAGED_MISSING);context.startServiceAsUser(intent, UserHandle.SYSTEM);windowManager.onSystemUiStarted();
}

2.AndroidMainifest配置

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
<!--将App配置为核心App 即最小Framework系统  作用加密机制
当开机检测到系统加密,会把核心App全部启动,并显示UI提示用户输入密码,密码输入正常后,才会启动完整系统-->coreApp="true"package="com.android.systemui"android:sharedUserId="android.uid.system"><!--常驻App,不会被kill-->
android:persistent="true"

3. SystemUIService中添加window窗口

public class SystemUIService extends BaseService {private WindowManager mWindowManager;private WindowManager.LayoutParams mLayoutParams;@Overridepublic void onCreate() {super.onCreate();Log.d("youdianxiaoshuai", "onCreate())");}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {//这里只是示例加了个顶部状态栏 不同的位置有不同的windowType可以根据自己需求添加mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);mLayoutParams = new WindowManager.LayoutParams();//顶部状态栏   顶部状态栏的windowTypemLayoutParams.type = WindowManager.LayoutParams.TYPE_STATUS_BAR; // 设置window type// 使窗口支持透明度mLayoutParams.format = PixelFormat.TRANSPARENT;mLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;mLayoutParams.flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;mLayoutParams.flags |= WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS;mLayoutParams.x = 0;// 以屏幕右上角为原点,设置x、y初始值mLayoutParams.y = 0;mLayoutParams.width = 1320;// 设置悬浮窗口长宽数据mLayoutParams.height = 56;mLayoutParams.gravity = Gravity.TOP | Gravity.RIGHT;mLayoutParams.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE;mLayoutParams.setTitle("StatusBar");mLayoutParams.packageName = mContext.getPackageName();//这里的view添加布局文件mWindowManager.addView(view, mLayoutParams);return super.onStartCommand(intent, flags, startId);}@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic void onDestroy() {super.onDestroy();}}

自定义Systemui(顶部,左侧和底部)相关推荐

  1. html锚点链接回到顶部,回到顶部和回到底部特效-jquery锚点移动兼容所有浏览器...

    插件描述:回到顶部和回到底部特效-jquery锚点移动兼容所有浏览器 回到顶部和回到底部在当前的网页中应用时相当广泛的 为了更好的体验,我们在回到顶部或回到底部的过程中采用一个渐进的滚动 那么我们就要 ...

  2. Android进阶之路 - 顶部状态栏、底部虚拟导航栏相关操作

    快过年了,2018希望我们每个人都健康,开心,同时继续上进 ! 2020补充:基本包含了我几年在开发中用到的关于顶部状态栏和底部导航栏的绝大部分功能 ~ 顶部状态栏 状态栏是否可见 获取状态栏高度 隐 ...

  3. HMI-43-【节能模式】顶部标题栏和底部信息栏及灯光及启动动画

    HMI-43-[节能模式]顶部标题栏和底部信息栏及灯光及启动动画 ​ 今天来实现以下节能模式的Title底部信息栏,灯光系统,以及启动动画,液晶仪表也就暂时告一段路了. 当前进度 ​ 到今天位置,三个 ...

  4. 微信小程序自定义回到顶部

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.自定义回到顶部按钮 二.使用步骤 1.第一步获取屏幕被卷去多少距离 2.进行判断,例如我需要屏幕滚到大于600的时 ...

  5. Android仿今日头条首页的顶部标签栏和底部导航栏

    Android仿今日头条首页的顶部标签栏和底部导航栏 先是底部导航栏TextView+ImageView+Fragment: 效果图: activity_main.xml布局: <?xml ve ...

  6. fastadmin 自定义table顶部的按钮

    记录:fastadmin 自定义table顶部的按钮 HTML代码: <a href="javascript:;" class="btn btn-success b ...

  7. 微信小程序自定义 顶部nav 和 底部tabbar

    文章目录 一.微信小程序自定义Nav: 1.首先在小程序app.json中添加 `"navigationStyle": "custom"`来标志自定义导航栏: ...

  8. chrome浏览器设置网页快速到顶部和到底部的方法

    鼠标移到浏览器的书签任意位置,点击鼠标右键添加书签,在添加书签的窗口输入名称和js代码,然后把书签移到浏览器书签栏的最左侧,这样每次浏览网页就可以使用快捷方式快速到底部或者顶部了. 快速到顶部的js代 ...

  9. odoo自定义按钮覆盖原来的底部按钮以及footer标签覆盖问题

    问题: odoo自身定义了底部和顶部的按钮,底部按钮定义在footer标签中.当想要覆盖odoo本来的底部按钮时,只需要自定义一个footer标签就可以 ** 解决办法:自定义footer标签 在模型 ...

最新文章

  1. CTF web题总结--SSRF
  2. CUBRID学习笔记 3 net连接数据库并使用cubrid教程示例
  3. mybatis maven 代码生成器(mysql)
  4. 利用反射,实现动态调用winform窗体
  5. Java的io类的使用场景
  6. 表单提交中Get和Post方式的区别及EncType表明提交数据的格式详解
  7. 动画---图形图像与动画(三)Animation效果的XML实现
  8. Spring4 快速入门
  9. Tiny服务的开发配套的工具来了
  10. 设计模式分类以及六大设计原则(汇总篇)
  11. 公司用的非标普通自动化用单片机还是plc_高级电气自动化工程师必备十大技能...
  12. CSDN - markdown 编辑器模板
  13. 关于word无法创建工作文件,请检查临时环境变量(本人已解决)
  14. 腾讯坐标系转化成百度坐标系
  15. 电商产品设计:后台订单管理设计
  16. 第一次用idea写SSM框架的项目就遇到自动注入失败的问题
  17. java过滤_java 过滤list的几种方式
  18. 程序员分手手册,教你如何恢复单身
  19. Redis 学习 - 05 Node.js 客户端操作 Redis、Pipeline 流水线
  20. 完美解决:不能为虚拟电脑打开一个新任务的问题

热门文章

  1. jfinal连接oracle_连接jfinal
  2. iccid码对实名制移动物联网卡的重要作用有哪些?
  3. Mesos-软件源方式安装配置说明
  4. MindSpore Quantum 量子计算编程与实践:轻松上手量子卷积神经网络
  5. 阿里二面,前端开发在web3.0中该如何应用,记录面经
  6. Dozer 轻松高效玩转DTO(Data Transfer Object)
  7. Android 非 SDK 接口常见问题
  8. tl494组成的超声波发射电路_最简单无线发射电路图大全(超声波发射/射频收发电路/调频发射器) - 全文...
  9. c# 未能加载文件或程序集mysql.data,SQLite的C#,.NET应用自适应32位/64位系统(未能加载文件或程序集“System.Data.SQLite.dll)...
  10. LQFP144封装尺寸图