一、内部服务配置

在packages/SystemUI/res/values/config.xml 文件中配置服务

<string-array name="config_systemUIServiceComponents" translatable="false"><item>com.android.systemui.Dependency</item><item>com.android.systemui.util.NotificationChannels</item><item>com.android.systemui.statusbar.CommandQueue$CommandQueueStart</item><item>com.android.systemui.keyguard.KeyguardViewMediator</item><item>com.android.systemui.recents.Recents</item><item>com.android.systemui.volume.VolumeUI</item><item>com.android.systemui.stackdivider.Divider</item><item>com.android.systemui.SystemBars</item><item>com.android.systemui.usb.StorageNotification</item><item>com.android.systemui.power.PowerUI</item><item>com.android.systemui.media.RingtonePlayer</item><item>com.android.systemui.keyboard.KeyboardUI</item><item>com.android.systemui.pip.PipUI</item><item>com.android.systemui.shortcut.ShortcutKeyDispatcher</item><item>@string/config_systemUIVendorServiceComponent</item><item>com.android.systemui.util.leak.GarbageMonitor$Service</item><item>com.android.systemui.LatencyTester</item><item>com.android.systemui.globalactions.GlobalActionsComponent</item><item>com.android.systemui.fingerprint.FingerprintDialogImpl</item><item>com.android.systemui.SliceBroadcastRelayHandler</item></string-array>

二、SystemUI内部服务的创建

三、SystemUI调用onConfigurationChanged流程

SystemUIApplication.java 为onConfigurationChanged入口

 @Overridepublic void onConfigurationChanged(Configuration newConfig) {if (mServicesStarted) {int len = mServices.length;for (int i = 0; i < len; i++) {if (mServices[i] != null) {mServices[i].onConfigurationChanged(newConfig);}}}callPluginConfigurationChanged(newConfig);}

1、第一个服务是从Dependency调用onConfigurationChanged方法,

@Overrideprotected synchronized void onConfigurationChanged(Configuration newConfig) {super.onConfigurationChanged(newConfig);mDependencies.values().stream().filter(obj -> obj instanceof ConfigurationChangedReceiver).forEach(o -> {Log.i(TAG, " o: " + ((ConfigurationChangedReceiver) o).getClass());((ConfigurationChangedReceiver) o).onConfigurationChanged(newConfig);});}

上面Log.i是自己加的,输出的类名依次

01-01 01:18:52.692  4610  4610 I Dependency:  o: class com.android.systemui.assist.AssistManager
01-01 01:18:52.711  4610  4610 I Dependency:  o: class com.android.systemui.statusbar.policy.NetworkControllerImpl
01-01 01:18:52.712  4610  4610 I Dependency:  o: class com.android.systemui.statusbar.phone.ConfigurationControllerImpl
01-01 01:18:52.733  4610  4610 I Dependency:  o: class com.android.systemui.fragments.FragmentService

AssistManager这是辅助管理类
NetworkControllerImpl 移动信号控制类onConfigurationChanged主要处理图标的重新加载
ConfigurationController 接口需要监听onConfigurationChanged方法的类,注册到ConfigurationControllerImpl里。
FragmentService 包含两个view key: com.android.systemui.statusbar.phone.StatusBarWindowViewcom.android.systemui.statusbar.phone.NavigationBarFrame
FragmentService.java

 @Overridepublic void onConfigurationChanged(Configuration newConfig) {for (FragmentHostState state : mHosts.values()) {state.sendConfigurationChange(newConfig);}}

接下来,调用内部类的FragmentHostState-> sendConfigurationChange

private class FragmentHostState {private final View mView;private FragmentHostManager mFragmentHostManager;public FragmentHostState(View view) { //利用上面提供view 创建两个FragmentHostManagermView = view;mFragmentHostManager = new FragmentHostManager(mContext, FragmentService.this, mView);}public void sendConfigurationChange(Configuration newConfig) {mHandler.post(() -> handleSendConfigurationChange(newConfig));}public FragmentHostManager getFragmentHostManager() {return mFragmentHostManager;}private void handleSendConfigurationChange(Configuration newConfig) {mFragmentHostManager.onConfigurationChanged(newConfig); //调用到具体view的onConfigurationChanged}}

FragmentHostManager.java

 protected void onConfigurationChanged(Configuration newConfig) {if (mConfigChanges.applyNewConfig(mContext.getResources())) {// Save the old state.Log.i(TAG, " Save the old state. ");Parcelable p = destroyFragmentHost(); //释放// Generate a new fragment host and restore its state.createFragmentHost(p);//重新创建Fragment} else {mFragments.dispatchConfigurationChanged(newConfig);}}

这里的释放Fragment 会调用到每个view 的fragment监控

 public interface FragmentListener {void onFragmentViewCreated(String tag, Fragment fragment);// The facts of lifecycle// When a fragment is destroyed, you should not talk to it any longer.default void onFragmentViewDestroyed(String tag, Fragment fragment) {}}

在StatusBarWindowView的创建时没有重载onFragmentViewDestroyed方法。

2、StatusBar.java 这是StatusBarWindowView的fragment监听

....
FragmentHostManager.get(mStatusBarWindow).addTagListener(CollapsedStatusBarFragment.TAG, (tag, fragment) -> {CollapsedStatusBarFragment statusBarFragment =(CollapsedStatusBarFragment) fragment;
...
});

3、StatusBar.java 创建NavigationBar的fragment监听

 protected void createNavigationBar() {mNavigationBarView = NavigationBarFragment.create(mContext,  (tag, fragment) -> {Log.i(TAG, " createNavigationBar ");mNavigationBar = (NavigationBarFragment) fragment;if (mLightBarController != null) {mNavigationBar.setLightBarController(mLightBarController);}mNavigationBar.setCurrentSysuiVisibility(mSystemUiVisibility);});

上面没有对onFragmentViewDestroyed方法重写,没有进行view的释放

NavigationBarFragment.java 这是navigationBarView的fragment添加监听到FragmentHostManager

     ...View navigationBarView = LayoutInflater.from(context).inflate(R.layout.navigation_bar_window, null); //解析xml布局if (DEBUG) Log.v(TAG, "addNavigationBar: about to add " + navigationBarView);if (navigationBarView == null) return null;context.getSystemService(WindowManager.class).addView(navigationBarView, lp); //设置view参数FragmentHostManager fragmentHost = FragmentHostManager.get(navigationBarView); //获取对应view的FragmentHostState里的包含的FragmentHostManager实例NavigationBarFragment fragment = new NavigationBarFragment();fragmentHost.getFragmentManager().beginTransaction().replace(R.id.navigation_bar_frame, fragment, TAG).commit();fragmentHost.addTagListener(TAG, listener);Log.i(TAG, " listener: " + listener);...

接下来就调用每个一个服务的onConfigurationChanged方法,如果用plugin方式插入view,重新创建fragmeng 会出现view重复加载的情况。解决这一问题的方法是将上次创建的view移除或是不重新创建fragment。

Android 9 SystemUI之内部SystemUI服务的创建相关推荐

  1. android 9.0新ui,SystemUI分析(Android9.0)

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 一.SystemUI组成 SystemUI是Android的系统界面,包括状态栏statusbar.锁屏keyboard ...

  2. Android系统Surface机制的SurfaceFlinger服务的线程模型分析

    在前面两篇文章中,我们分析了SurfaceFlinger服务的启动过程以及SurfaceFlinger服务初始化硬件帧缓冲区的过程.从这两个过程可以知道,SurfaceFlinger服务在启动的过程中 ...

  3. Android系统Surface机制的SurfaceFlinger服务渲染应用程序UI的过程分析

    出自:http://blog.csdn.net/luoshengyang/article/details/8079456 在前面的一系列文章中,我们学习了Android应用程序与SurfaceFlin ...

  4. Android系统Surface机制的SurfaceFlinger服务的启动过程分析

    在前面一篇文章中,我们简要介绍了Android系统Surface机制中的SurfaceFlinger服务.SurfaceFlinger服务是在System进程中启动的,并且负责统一管理设备的帧缓冲区. ...

  5. Android系统Surface机制的SurfaceFlinger服务对帧缓冲区(Frame Buffer)的管理分析

    在前文中,我们分析了SurfaceFlinger服务的启动过程.SurfaceFlinger服务在启动的过程中,会对系统的硬件帧缓冲区进行初始化.由于系统的硬件帧缓冲区一般只有一个,并且不是谁都可以随 ...

  6. Android系统Surface机制的SurfaceFlinger服务简要介绍和学习计划

    前面我们从Android应用程序与SurfaceFlinger服务的关系出发,从侧面简单学习了SurfaceFlinger服务.有了这些预备知识之后,我们就可以从正面来分析SurfaceFlinger ...

  7. android学习十八(Service服务的基本用法)

    定义一个服务 在项目中定义一个服务,新建一个ServiceTest项目,然后在这个项目中新增一个名为MyService的类,并让它继承自Service,完成后的代码如下所示: package com. ...

  8. Android Service完全解析,关于服务你所需知道的一切(上)

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/11952435 相信大多数朋友对Service这个名词都不会陌生,没错,一个老练的A ...

  9. 境外 android 支付功能,Paypal向Android开发者提供应用内部支付功能

    腾讯科技讯(编译/中涛)北京时间5月20日消息,据国外媒体报道,eBay旗下网络支付平台Paypal周三宣布,已面向Android手机平台的外部开发者发布了"移动支付库"(Mobi ...

最新文章

  1. Codeforces Round #370 (Div. 2)E. Memory and Casinos[期望概率+线段树区间合并]详细推导
  2. linux中使用scp远程拷贝文件及文件夹
  3. 孰轻孰重:可穿戴式设备的助益与风险
  4. 信令风暴研究现状总结
  5. 分布式系统的Raft算法——在失联阶段这个老Leader的任何更新都不能算commit,都回滚,接受新的Leader的新的更新 意味着还是可能丢数据!!!...
  6. Zookeeper--Watcher机制源码剖析一
  7. 通过Nginx反向代理,实现远程调试本机代码
  8. TensorFlow tf.keras.layers.GlobalAveragePooling1D
  9. Python将类对象转换为json
  10. Kotlin中定义编译时常量
  11. 深入解读Linux内存管理系列(3)——MMU初始化和页表的建立
  12. 微服务网关——需求篇
  13. 正方教务系统对服务器的要求,正方软件教务系统功能介绍.docx
  14. FPGA工程师面试试题集锦11~20
  15. 牛客网力扣算法编程之二十一 | 数组 - 明明的随机数 - Java代码实现
  16. 安卓4.4刷linux系统下载,在Linux上安装Android 4.4 KitKat
  17. 电压源电流源电路符号及2B法
  18. CTime和COleDateTime区别 比较
  19. C 语言到底能做什么?What can C do?
  20. uni-app动态引入图片

热门文章

  1. 重来之大学版|学习篇-大学逃课问题,逃学威龙低配版
  2. elasticsearch 添加或修改分词器
  3. Matlab数组创建、数组寻址、数组排序、数组检测、数组结构
  4. 会议论文影响因子多少_整天都在讲的SCI论文、影响因子、核心期刊到底是什么?...
  5. 网络安全设备评测:谁是最好的防火墙
  6. axios(三)- 源码
  7. 美国队长的工资 python代码-用Python绘制美国队长盾牌
  8. mediapipe bazel 编译问题
  9. UI设计学习路线是什么 怎么多方面学UI设计
  10. Java生成词云KUMO