布局结构
抓取布局后,可以看到每个图标是一个DoubleShadowBubbleTextView,父布局是CellLayout、workspace。
我们可以在CellLayout添加子view打印出调用堆栈信息,可以整体上看页面加载显示流程。
主要类
- Launcher.java:主界面,即MainActivity
- launcher.xml:主界面布局文件
- LauncherModel.java:管理Launcher状态,包括加载任务、状态回调等
- LoaderTask.java:加载任务,是一个Runnable
- LoaderResults.java:加载结果
- BgDataModel#Callbacks:数据回调接口,Launcher实现该接口,加载任务通过该接口回调给Launcher
- LauncherProvider:桌面数据提供者,采用db保存桌面图标数据(包括排列位置、类型等)
- LauncherSettings:封装访问LauncherProvider时的uri、column等一些常量,通过ContentResolver来访问LauncherProvider,不直接操作db
- LoaderCursor:封装cursor操作
流程图

创建Activity
主界面创建的时候,常规的setContentView和findView,创建LauncherModel并开始加载数据
// Launcher.java
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 1.创建LauncherAppState和LauncherModel
LauncherAppState app = LauncherAppState.getInstance(this);
mModel = app.getModel();
// 2.infalte布局文件,找到view
setupViews();
// 3. 设置loader监听,开始加载数据,加载完成后回调给主界面
if (!mModel.addCallbacksAndLoad(this)) {
if (!internalStateHandled) {
// If we are not binding synchronously, pause drawing until initial bind complete,
// so that the system could continue to show the device loading prompt
mOnInitialBindListener = Boolean.FALSE::booleanValue;
}
}
// 4. 设置view给Activity
setContentView(getRootView());
加载数据
创建加载任务
mModel.addCallbacksAndLoad将Launcher设置给LauncherModel,然后创建了加载任务
// LauncherModel.java
/**
* Adds a callbacks to receive model updates
* @return true if workspace load was performed synchronously
*/
public boolean addCallbacksAndLoad(@NonNull final Callbacks callbacks) {
synchronized (mLock) {
addCallbacks(callbacks);
return startLoader(new Callbacks[] {
callbacks });
}
}
private boolean startLoader(@NonNull final Callbacks[] newCallbacks) {
synchronized (mLock) {
// 1.取消旧的加载任务
boolean wasRunning = stopLoader(); // 之前没有loader任务,wasRunning为false
boolean bindDirectly = mModelLoaded && !mIsLoaderTaskRunning;// 之前没有加载过,bindDirectly为false
boolean bindAllCallbacks = wasRunning || !bindDirectly || newCallbacks.length == 0; // bindAllCallbacks为true, 上一步已经addCallbacks了,所以callbacksList里面包含从Launcher.java传进来的callbacks
final Callbacks[] callbacksList = bindAllCallbacks ? getCallbacks() : newCallbacks;
if (callbacksList.length > 0) {
// 2.清空PendingBind
for (Callbacks cb : callbacksList) {
MAIN_EXECUTOR.execute(cb::clearPendingBinds);
}
// 3.创建LoaderResults和LoaderTask,开始加载数据
LoaderResults loaderResults = new LoaderResults(
mApp, mBgDataModel, mBgAllAppsList, callbacksList);
if (bindDirectly) {
loaderResults.bindWorkspace(bindAllCallbacks);
loaderResults.bindAllApps();
loaderResults.bindDeepShortcuts();
loaderResults.bindWidgets();
return true;
} else {
stopLoader();
mLoaderTask = new LoaderTask(
mApp, mBgAllAppsList, mBgDataModel, mModelDelegate, loaderResults);
MODEL_EXECUTOR.post(mLoaderTask);
}
}
}
}
整体加载步骤
LoaderTask#run中根据类型加载步骤分为了5步,图标的加载主要看第一步
// LoaderTask.java
public v


最低0.47元/天 解锁文章
614

被折叠的 条评论
为什么被折叠?



