Launcher中的workspace加载流程(Allapps及Weights相似)

在这里插入图片描述

一、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, 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值