一、为何要用插件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() {
版权归原作者 luyu22 所有, 如有侵权,请联系我们删除。