赞
踩
只要保证这个注解标记的 Component 在 App 进程中为单例的,并且得到正确的实现(被正确的标记到 类构造器 或 Module 中的 @Provides 标记的方法),那么它对应生成的类实例就是 单例的。
SystemUI的application标签定义了一个appComponentFactory属性
<application
…
android:appComponentFactory=“.SystemUIAppComponentFactory”>
AppComponentFactory用于控制manifest清单文件里的组件的初始化
在manifest清单文件里的组件构建对象时会调用这些方法
src/com/android/systemui/SystemUIAppComponentFactory.java
public Application instantiateApplicationCompat(
@NonNull ClassLoader cl, @NonNull String className)
throws InstantiationException, IllegalAccessException, ClassNotFoundException {
Application app = super.instantiateApplicationCompat(cl, className);
if (app instanceof ContextInitializer) {
((ContextInitializer) app).setContextAvailableCallback(
context -> {
SystemUIFactory.createFromConfig(context);
SystemUIFactory.getInstance().getSysUIComponent().inject(
SystemUIAppComponentFactory.this);
}
);
}
return app;
}
在SystemUIApplication onCreate时回调 ContextAvailableCallback, 构建SystemUIFactory,并对它进行初始化
src/com/android/systemui/SystemUIFactory.java
public static void createFromConfig(Context context, boolean fromTest) {
if (mFactory != null) {
return;
}
final String clsName = context.getString(R.string.config_systemUIFactoryComponent);
if (clsName == null || clsName.length() == 0) {
throw new RuntimeException(“No SystemUIFactory component configured”);
}
try {
Class<?> cls = null;
cls = context.getClassLoader().loadClass(clsName);
// 创建SystemUIFactory实例
mFactory = (SystemUIFactory) cls.newInstance();
// 初始化SystemUIFactory
mFactory.init(context, fromTest);
} catch (Throwable t) {
Log.w(TAG, "Error creating SystemUIFactory component: " + clsName, t);
throw new RuntimeException(t);
}
}
public void init(Context context, boolean fromTest)
throws ExecutionException, InterruptedException {
…
// 获取dagger组件
mRootComponent = buildGlobalRootComponent(context);
…
// 获取systemui的dagger组件
// And finally, retrieve whatever SysUI needs from WMShell and build SysUI.
SysUIComponent.Builder builder = mRootComponent.getSysUIComponent();
mSysUIComponent = builder.build();
…
// 构建Dependency实例并初始化
// Every other part of our codebase currently relies on Dependency, so we
// really need to ensure the Dependency gets initialized early on.
Dependency dependency = mSysUIComponent.createDependency();
dependency.start();
}
protected GlobalRootComponent buildGlobalRootComponent(Context context) {
return DaggerGlobalRootComponent.builder()
.context(context)
.build();
}
Dependency组件使用@Lazy标签懒加载: 首先构建LazyDependencyCreator放入mProviders,然后在真正使用dependency时调用createDependency进行创建
src/com/android/systemui/Dependency.java
private final ArrayMap<Object, Object> mDependencies = new ArrayMap<>();
private final ArrayMap<Object, LazyDependencyCreator> mProviders = new ArrayMap<>();
@Inject Lazy mActivityStarter;
@Inject Lazy mBroadcastDispatcher;
@Inject Lazy mAsyncSensorManager;
@Inject Lazy mBluetoothController;
protected void start() {
// 构建LazyDependencyCreator放入mProviders
mProviders.put(TIME_TICK_HANDLER, mTimeTickHandler::get);
mProviders.put(BG_LOOPER, mBgLooper::get);
mProviders.put(MAIN_LOOPER, mMainLooper::get);
mProviders.put(MAIN_HANDLER, mMainHandler::get);
mProviders.put(MAIN_EXECUTOR, mMainExecutor::get);
mProviders.put(BACKGROUND_EXECUTOR, mBackgroundExecutor::get);
mProviders.put(ActivityStarter.class, mActivityStarter::get);
mProviders.put(BroadcastDispatcher.class, mBroadcastDispatcher::get);
…
// 获取dependency
private synchronized T getDependencyInner(Object key) {
@SuppressWarnings(“unchecked”)
T obj = (T) mDependencies.get(key);
if (obj == null) {
// 若未创建则创建
obj = createDependency(key);
mDependencies.put(key, obj);
…
}
return obj;
}
public T createDependency(Object cls) {
Preconditions.checkArgument(cls instanceof DependencyKey<?> || cls instanceof Class<?>);
@SuppressWarnings(“unchecked”)
LazyDependencyCreator provider = mProviders.get(cls);
if (provider == null) {
throw new IllegalArgumentException("Unsupported dependency " + cls
// 这里调用的就是lazy.get()
return provider.createDependency();
}
private interface LazyDependencyCreator {
T createDependency();
}
Application创建好之后SystemUI的主Service将启动起来,并逐个启动其他Service。
src/com/android/systemui/SystemUIService.java
public void onCreate() {
super.onCreate();
// Start all of SystemUI
((SystemUIApplication) getApplication()).startServicesIfNeeded();
…
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
考虑到文章的篇幅问题,我把这些问题和答案以及我多年面试所遇到的问题和一些面试资料做成了PDF文档,如果有需要的朋友可以私信我【面试】免费领取
些面试资料做成了PDF文档,如果有需要的朋友可以私信我【面试】免费领取
[外链图片转存中…(img-GQH3e1Qx-1710833780277)]
[外链图片转存中…(img-IWZWoJjc-1710833780278)]
喜欢的朋友可以关注、转发、点赞 感谢!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。