Launcher学习2-初始化桌面

目录结构

  • allapps目录:主要存放主菜单界面相关代码
  • anim目录:存放动画相关
  • badge目录:存放图标标识相关
  • compat目录:存放解决兼容性相关
  • config目录:配置Launcher相关功能的宏开关
  • dragndrop目录:存放拖拽相关
  • graphics目录:存放处理图标大小、颜色、自适应
  • model目录:存放Launcher加载流程相关模块化
  • notification目录:存放通知相关
  • pageindicators目录:存放桌面页面指示器相关
  • popu目录:存放长按图标显示弹出框相关
  • provider目录:存放Launcher数据库相关
  • qsb目录:存放搜索功能相关
  • shortcuts目录:存放桌面所属应用某些功能的快捷图标相关

一、初始化桌面

Launcher创建的总体流程

1.初始化Launcher运行环境

对运行环境的初始化,这些信息将 保存在LauncherAppState实例中,并通过LauncherAppState建立与桌面数据库的联系,以便能及时响应数据库的变化

LauncherAppState.setApplicationContext(getApplicationCOntext());
LauncherAppState app=LauncherAppState.getInstance();
LauncherAPPstate.getLauncherProvider().setLauncherProviderChangeListener(this);

2.生成Launcher的动态网格进行必要的准备

动态网格的决定因素是当前设备的长宽及密度等相关属性,获取设备属性的代码如下所示:

Ponit smallestSize=new Point();
Point largestSize=new Point();
Display display=getWindowManager().getDefaultDisplay;
display.getCurrentSizeRanage(smallestSize,largestSize);
display.getRealSize(realSize);
DisplayMetrics dm=new DisplayMetrics();
display.getMetrics(dm);

3.生成动态网格

这里所说的动态网格指的是Launcher的桌面有多少个格子(cell)

DeviceProfile gria=app.initDynamicGrid(this,
                                       Math.min(SmallestSize.x,smallestSize.y),
                                       Math.min(largestSize.x,largestSize.y),
                                       realSize.x,realSize.y,
                                       dm.widthPixels,dm.heightPixels);

这样就完成了桌面重要属性的计算,这些信息保存在grid(DeviceProfile的对象)中。

4.获取共享数据对象以及建立Launcher与LauncherModel的联系

代码如下:

mSharedPrefs=getSharedPreferences(LauncherAppState.getSharedPreferencesKey(),Context.MODE_PRIVATE);
mModel=app.setLauncher(this);

Launcher在运行时会保存一些中间状态和运行信息。这些信息被保存在一个名叫com.android.launcher3.prefs的文件中。通过上下文的getSharedPreferences方法可以获取其中的信息来读写此文件的接口类对象(mSharedPrefs)。
com.android.launcher3.prefs文件包括如下信息:

  • launcher.first_load_complete:这是一个布尔型的字段,它的含义是Launcher第一次加载完成;
  • launcher.first_run_activity_displayed:这是一个布尔型的字段,它的含义是Launcher第一次被使用;
  • launcher.intro_screen_dismissed:这是一个布尔型的字段,它的含义是介绍界面曾经被显示。

Launcher和LauncherModel之间是通过LauncherModel的LauncherModel.Callbacks接口来实现的。LauncherModel可以看成是一个数据生成器,它所生成的数据需要通过LauncherModel.Callbacks接口传递给Launcher来处理。因此,需要建立Launcher和LauncherModel之间的联系,一九四要将Launcher的接口部分设置到LauncherModel中,这是一个间接的过程,通过LauncherAppState的setLauncher方法完成。

5.根据动态网格刷新图标缓冲区

LauncherAppState在实例化的过程中完成了Launcher用于存储应用程序图标的缓存区,但缓存区没有得到精确的初始化,图标的尺寸可能还未符合当前设备的实际情况,所以这里需要根据动态网格的属性刷新图标缓存区,IconCache的flushInvalidIcons方法将完成这个任务,如下列代码所示:

mIconCache =app.getIconCache();
mIconCache.flushInvalidIcons(grid);

6.获取应用程序的运行状态

Launcher中有一个stats.log文件,它用于保存曾经被启动的应用程序信息(启动的Intent信息等)。Launcher在启动的时候需要通过Stats实例去获取这些信息,以供后续使用。在Stats类被实例化的时候,它会读取stats.log文件中的信息,保存在Stats实例中。

public Stats(Launcher launcher){
	mLauncher-launcher;
	...
	stats=new DataInputStream(mLauncher.openFileInput(STATS_FILE_NAME));
	final int N=stats.readInt();
	for(int i=0;i<N;i++){
        final String pkg=stats.readUTF();
        final int count=stats.readInt();
        mIntents.add(pkg);
        mHistogram.add(count);
    }
    ...
}

7.创建并启动WidgetHost

Launcher实现了自己的AppWidgetHost和AppWidgetHostView,它们分别是LauncherAppWidgetHost和LauncherAppWidgetHostView。在Launcher创建的时候,需要创建AppWidgetHost并启动监听,如下列代码所示:

mAppWidgetManager=AppWidgetManager.getInstance(this);
mAppWidgetHost=new LauncherAppWidgetHost(this,APPWIDGET_HOST_ID);
mAppWidgetHost.startListening();

当一些本地配置发生改变时,需要更新某些桌面元素,因此在创建的时候,首先要对这些配置进行检查,checkForLocaleChange方法将完成这个工作,整个工作流程如图:
image.png

1.读取Launcher保存的Local信息

Launcher在运行过程中,会将重要的配置信息保存在一个LocaleConfiguration类型的静态变量中。在启动初期,这个变量值是null,这个时候Launcher将会从launcher.preferences的配置文件中读取mcc、mnc以及local信息,并将其保存在这个静态变量中,然后重新发布到Launcher的checkLocalConfiguration中:
image.png
checkForLocaleChange方法在启动过程中分配了一个异步任务,去完成读取本地配置的任务。当完成任务的时候,这个异步任务将结果通过onPostExecute重新发布到checkForLocaleChange方法中。

2.从文件中读取历史配置信息

检查配置是否有改变的关键是读取历史配置,这些历史的配置信息被Launcher保存在launcher.preferences文件中。这个文件保存了上一次配置变化时的local、mcc、mnc信息。Launcher使用checkForLocaleChange方法去读取这些黑信息并保存到相应的变量中。

3.更新配置信息

当一部任务完成并将结果重新发布到checkForLocaleChange方法中的时候,由于sLocaleConfiguration变量不在为null,因此checkForLocaleChange将继续后续的更新流程。更新配置信息的过程如下列代码所示:

//获取当前设备的配置信息
final Configuration configuration=getResources().getConfiguration();
//获取历史和当前的local信息
final String previousLocale=sLocaleConfiguration.locale;
final String locale=configuration.locale.toString();
//获取历史和当前的mcc信息
final int previoudMcc=sLocaleConfiguration.mcc;
final int mcc=configuration.mcc;
//获取历史和当前的mnc信息
final int previousMnc=sLocaleConfiguration.mnc;
final int mnc=configuration.mnc;
//比较是否有变化
boolean localeChanged=!locale.equals(previousLocale)||mcc!=previousMnc||mnc!=previousMnc;
4.更新Launcher本地配置文件以及刷新图片缓存

Launcher如果发现当前设备与本地配置有所不同,它将完成写配置文件和刷新图片缓存的任务,而它在启动过程中,也会根据这里的情况去决定桌面图标等资源的使用。这一过程如下列代码所示:

//如果本地配置较当前设备配置发生了改变
if(localeChanged){
    //更新本地配置
	sLocaleConfiguration.locale=locale;
    sLocaleConfiguration.mcc=mcc;
    sLocaleConfiguration.mnc=mnc;
    //刷新图片缓存区
    mIconCache.flush();
    //更新Launcher配置文件
    final LocaleConfiguration localeConfiguration=sLocaleConfiguration;
    new AsyncTask<Void,Void,Void>(){
        public Void doInBackground(Void ...args){
            writeConfiguration(Launcher.this,localeConfiguration);//更新Launcher配置文件
            return null;
    }
    }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,(Void) null);
}

其中Launcher使用了IconCache的flush方法来刷新图片缓存区。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pengkai焱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值