Launcher8.0启动流程的第六步startLoader的第一步Loadworkspace完成,接着是第二步bindworkspace。 这一步将sBgDataModel中的图标放到桌面上。 放置的时候需要先创建屏幕而后才能将图标放到屏幕里。
源码如下:
private void bindWorkspace(int synchronizeBindPage) {
final long t = SystemClock.uptimeMillis();
Runnable r;
//启动流程Launcher调用LauncherModel的方法startLoader,而LauncherModel又会调用Launcher的方法来完成startLoader的操作。在Launcher的启动流程的第三步创建必须的对象中创建的第二个对象是LauncherModel的对象,在创建的时候传入了Launcher本身,而这个Launcher的对象在LauncherMedel类里面叫做Callbacks。随后的方法 final Callbacks oldCallbacks = mCallbacks.get();就是获取Launcher对象。
final Callbacks oldCallbacks = mCallbacks.get();
if (oldCallbacks == null) {
Log.w(TAG, "LoaderTask running with no launcher");
return;
}
//随后将sBgDataModel里面存储的桌面布局信息放到LauncherModel的集合里面,这样方便使用这些信息。一共创建了三个信息,屏幕数,桌面图标,桌面widget。后面将按照屏幕数、桌面图标、桌面widget依次绘制。
ArrayList<ItemInfo> workspaceItems = new ArrayList<>();
ArrayList<LauncherAppWidgetInfo> appWidgets = new ArrayList<>();
ArrayList<Long> orderedScreenIds = new ArrayList<>();
synchronized (sBgDataModel) {
workspaceItems.addAll(sBgDataModel.workspaceItems);
appWidgets.addAll(sBgDataModel.appWidgets);
orderedScreenIds.addAll(sBgDataModel.workspaceScreens);
}
//图标信息到位之后,先找到当前屏幕。获取屏幕的id,屏幕的id是0,1,2这个顺序,且严格按照这个顺序。比如Id为1,则必定是从左往右的第2个屏幕。在图标信息iteminfo里面存有每个图标的screenid信息。
final int currentScreen;
{
int currScreen = synchronizeBindPage != PagedView.INVALID_RESTORE_PAGE
? synchron