Android4.4-Launcher源码分析系列之Launcher启动简介

一、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.第一次运行的时候提示帮助,就是那些手指点哪里的提示信息.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章