0


SystemUI之插件Plugin

一、为何要用插件plugin

SystemUI模块非常多,结构自然也就非常复杂,而且SystemUI是一个常驻的进程,不能随意做修改升级,如果修改不到位,很可能会存在bug,这是修复就非常难。另外一个原因是可以方便客户客制化,如需要改变状态栏的背景色、显示时钟的风格、锁屏壁纸等等都可以直接通过插件的方式来修改,不需要对SystemUI重新定制。所以,使用插件极大地方便了客户,又维持了系统的稳定。

二、插件代码结构,主要由plugin、plugin_core、share这三部分模块构成

1、plugin:ExamplePlugin是提供参考的例子,src里面主要是以接口的形式提供支持,并且包括FalsingPlugin、VolumePlugin、NotificationPlugin、QSPlugin等插件实例。

2、plugin_core:插件的核心,主要是要实现一些接口

3、share:插件的管理类、版本信息等

这些插件的接口信息等都是通过dragger注入的方式来实现的,如不理解dragger注入,可先学习dragger2的注入原理

三、插件的加载流程

1、SystemUI的Application上通过读取配置信息启动每个SystemUI的子服务,同时创建PluginManager的实现实例,添加监听事件

frameworks\base\packages\SystemUI\src\com\android\systemui\SystemUIApplication.java
private void startServicesIfNeeded(String[] services) {
   ......................
    Dependency.get(PluginManager.class).addPluginListener(
            new PluginListener<OverlayPlugin>() {
                private ArraySet<OverlayPlugin> mOverlays = new ArraySet<>();

                @Override
                public void onPluginConnected(OverlayPlugin plugin, Context pluginContext) {
                    mainHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            StatusBar statusBar = getComponent(StatusBar.class);
                            if (statusBar != null) {
                                plugin.setup(statusBar.getStatusBarWindow(),
                                        statusBar.getNavigationBarView(), new Callback(plugin));
                            }
                        }
                    });
                }

                @Override
                public void onPluginDisconnected(OverlayPlugin plugin) {
                    mainHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            mOverlays.remove(plugin);
                            Dependency.get(StatusBarWindowController.class).setForcePluginOpen(
                                    mOverlays.size() != 0);
                        }
                    });
                }

                class Callback implements OverlayPlugin.Callback {
                    private final OverlayPlugin mPlugin;

                    Callback(OverlayPlugin plugin) {
                        mPlugin = plugin;
                    }

                    @Override
                    public void onHoldStatusBarOpenChange() {
                        if (mPlugin.holdStatusBarOpen()) {
                            mOverlays.add(mPlugin);
                        } else {
                            mOverlays.remove(mPlugin);
                        }
                        mainHandler.post(new Runnable() {
               
标签: android java c++

本文转载自: https://blog.csdn.net/luyu22/article/details/136524842
版权归原作者 luyu22 所有, 如有侵权,请联系我们删除。

“SystemUI之插件Plugin”的评论:

还没有评论