一、Launcher的启动
首先启动LauncherApplication,这里面只有两行代码,初始化了LauncherAppState,LauncherAppState主要是初始化一些对象,注册广播和内容观察者等.比如你安装程序和卸载程序,里面都会监听这个广播.
之后启动Launcher这个Activity,看它的oncreate方法.
@Override
protected void onCreate(Bundle savedInstanceState) {
if (DEBUG_STRICT_MODE) {
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork() // or
.penaltyLog().build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());
}
super.onCreate(savedInstanceState);
// 初始化Context,获取LauncherAppState实例
LauncherAppState.setApplicationContext(getApplicationContext());
LauncherAppState app = LauncherAppState.getInstance();
// 确定grid属性
Point smallestSize = new Point();
Point largestSize = new Point();
Point realSize = new Point();
Display display = getWindowManager().getDefaultDisplay();
display.getCurrentSizeRange(smallestSize, largestSize);
display.getRealSize(realSize);
DisplayMetrics dm = new DisplayMetrics();
display.getMetrics(dm);
// Lazy-initialize the dynamic grid
DeviceProfile grid = app.initDynamicGrid(this, Math.min(smallestSize.x, smallestSize.y), Math.min(largestSize.x, largestSize.y), realSize.x, realSize.y, dm.widthPixels, dm.heightPixels);
//获取SharedPreferences实例
mSharedPrefs = getSharedPreferences(LauncherAppState.getSharedPreferencesKey(), Context.MODE_PRIVATE);
// 获取LauncherModel实例
mModel = app.setLauncher(this);
// 获取IconCache实例
mIconCache = app.getIconCache();
mIconCache.flushInvalidIcons(grid);
// 获取DragController实例
mDragController = new DragController(this);
mInflater = getLayoutInflater();
mStats = new Stats(this);
// 获取AppWidgetManager实例
mAppWidgetManager = AppWidgetManager.getInstance(this);
// 获取AppWidgetHost实例并且监听
mAppWidgetHost = new LauncherAppWidgetHost(this, APPWIDGET_HOST_ID);
mAppWidgetHost.startListening();
// If we are getting an onCreate, we can actually preempt onResume and
// unset mPaused here,
// this also ensures that any synchronous binding below doesn't
// re-trigger another
// LauncherModel load.
mPaused = false;
if (PROFILE_STARTUP) {
android.os.Debug.startMethodTracing(Environment.getExternalStorageDirectory() + "/launcher");
}
checkForLocaleChange();
setContentView(R.layout.launcher); // 设置布局
setupViews();
grid.layout(this);
//注册内容观察者
registerContentObservers();
lockAllApps();
mSavedState = savedInstanceState;
restoreState(mSavedState);
// 更新抽屉界面状态
if (mAppsCustomizeContent != null) {
mAppsCustomizeContent.onPackagesUpdated(LauncherModel.getSortedWidgetsAndShortcuts(this));
}
if (PROFILE_STARTUP) {
android.os.Debug.stopMethodTracing();
}
// 加载桌面的图标,widget等
if (!mRestoring) {
if (sPausedFromUserAction) {
// If the user leaves launcher, then we should just load items
// asynchronously when
// they return.
mModel.startLoader(true, -1);
} else {
// We only load the page synchronously if the user rotates (or
// triggers a
// configuration change) while launcher is in the foreground
mModel.startLoader(true, mWorkspace.getCurrentPage());
}
}
// 处理默认键
mDefaultKeySsb = new SpannableStringBuilder();
Selection.setSelection(mDefaultKeySsb, 0);
// 注册广播,监听关闭系统Dialog
IntentFilter filter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
registerReceiver(mCloseSystemDialogsReceiver, filter);
// 更新所有的icon
updateGlobalIcons();
// 开启自动旋转
unlockScreenOrientation(true);
// 第一次运行的时候提示帮助
showFirstRunCling();
}<span style="font-size:14px;">
</span>
1.初始化LauncherAppState.
2.初始化DeviceProfile,DeviceProfile里保存了很多Launcher的属性.比如Icon的大小,Icon标题的大小等.
3.获取SharedPreferences实例mSharedPrefs,mSharedPrefs保存的都是第一次开机时的提示信息.
4.获取LauncherModel实例..是操作数据有关的,保存了桌面运行的状态.像加载widget和快捷方式到桌面都是通过它.
5.获取IconCache实例,从字面看就知道是保存了图标的信息.
6.获取DragController实例,前面文章介绍了,一个拖动控制接口.
7.获取AppWidgetManager实例,是用来管理widget的.
8.setContentView(R.layout.launcher) 设置布局.
9.setupViews 控件的初始化,注册点击监听等.
10.注册内容观察者.
11.加载桌面的图标,widget等,调用LauncherModel的startLoader方法进行加载.
12.处理默认键.
13.注册广播,监听关闭系统Dialog.
14.更新所有的icon.
15.开启自动旋转屏幕.
16.第一次运行的时候提示帮助,就是那些手指点哪里的提示信息.