一、AndroidMainifest文件
在Application的标签中有activity和provider分别是Launcher,settingsActivity和LauncherProvider
其中,Launcher是手机可以看到的桌面,Settings是桌面的设置页面,LauncherProvider是用来存储页面的布局信息的 。
二、桌面布局:
1、Launcher界面配置的文件:
该位置一般处于:
\Launcher\res\xml\default_workspace.xml
注意有可能存在partner app此时的设置需要在partner中设置
<appwidget
launcher:className="" //应用的类
launcher:packageName=""//应用的包名
launcher:screen=""当前处于哪一屏
launcher:x="" //图标X位置,左上角是第0个
launcher:y="" //图标Y位置,左上角是第0个
launhcer:spanX="" //在x方向所占的格数
launcher:spanY="" //在y方向所占的格数
>
2、Launcher.java的onCreate方法:
在该部分中,完成了对于Launcher的一些初始化的工作,建立了LaunhcerAppState对象和LauncherModel对象的初始化,以及其他信息的初始化。开启数据加载设置
对于状态进行判断,我们不需要进行任何的配置
对于事件进行绑定,如果没有绑定则进行事件的绑定
3、LauncherModel的startLoader方法
在该方法中主要实现了对于LoaderTask进行启动
LocalModel对象主要保存在数据库中,主要保存了各种布局信息的
- 对于当前的数据进行判断是否有效,在此时以线程的方式进行实现
private boolean mModelLoaded;
public boolean isModelLoaded(){
synchronized(mLock){
return mModelLoaded&& mLoaderTask==null;
}
}
- startLoader方法
该方法是加载程序的启动,在启动过程中并对于数据进行尝试同步绑定,若能够进行绑定则可以返回true,在实现的过程中调用的是工作线程LoaderTask
public boolean startLoader() {
//启动队列在数据加载之前,
ItemInstallQueue.INSTANCE.get(mApp.getContext())
.pauseModelPush(ItemInstallQueue.FLAG_LOADER_RUNNING);
synchronized (mLock) {
//以单线程的方式执行
final Callbacks[] callbacksList = getCallbacks();
if (callbacksList.length > 0) {
//在同步加载过程中对于所有挂起的绑定可运行项进行清除
for (Callbacks cb : callbacksList) {
MAIN_EXECUTOR.execute(cb::clearPendingBinds);
}
//对于旧的运行项进行一个清除
stopLoader();
LoaderResults loaderResults = new LoaderResults(
mApp, mBgDataModel, mBgAllAppsList, callbacksList);
if (mModelLoaded && !mIsLoaderTaskRunning) {
//将同步项绑定于workspace、allapps、快捷方式、桌面小组件
loaderResults.bindWorkspace();
loaderResults.bindAllApps();
loaderResults.bindDeepShortcuts();
loaderResults.bindWidgets();
return true;
} else {
//正在工作 的不是空则无需绑定
startLoaderForResults(loaderResults);
}
}
}
return false;
}
//当有加载任务正在运行时则进行其停止运行
public boolean stopLoader() {
synchronized (mLock) {
LoaderTask oldTask = mLoaderTask;
mLoaderTask = null;
if (oldTask != null) {
oldTask.stopLocked();
return true;
}
return false;
}
}
//对于LocalderTask进行启动:
public void startLoaderForResults(LoaderResults results) {
synchronized (mLock) {
stopLoader();
mLoaderTask = new LoaderTask(
mApp, mBgAllAppsList, mBgDataModel, mModelDelegate, results);
//发布加载程序任务
MODEL_EXECUTOR.post(mLoaderTask);
}
}
4、LocalTask中的run方法:
public void run() {
synchronized (this) {
//加锁的方式进行判断当mStopped是true时快速跳过
// Skip fast if we are already stopped.
if (mStopped) {
return;
}
}
Object traceToken = TraceHelper.INSTANCE.beginSection(TAG);
TimingLogger logger = new TimingLogger(TAG,