Android4.4 Framework分析——Android默认Home应用Launcher3的加载过程分析
来源:互联网作者:佚名 时间: 2015年08月08日 19:56:23
Android4.4 Framework分析——Android默认Home应用Launcher3的加载过程分析
本文主要介绍Android4.4默认Home应用Launcher3的启动过程和Launcher3的数据加载过程。Launcher的启动是开机时,ActivityManagerService准备好后开始的,下图是它的启动序列图: step1,SystemServer中,ActivityManagerService准备好了。 step3,
boolean resumeTopActivitiesLocked(ActivityStack targetStack, ActivityRecord target, Bundle targetOptions) { if (targetStack == null) { targetStack = getFocusedStack(); //获得mHomeStack } boolean result = false; for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { final ActivityStack stack = mStacks.get(stackNdx); if (isFrontStack(stack)) { if (stack == targetStack) { result = stack.resumeTopActivityLocked(target, targetOptions); } else { stack.resumeTopActivityLocked(null); } } } return result; } mStacks中已经添加过mHomeStack,mStacks的内容介绍请查看 Android4.4 Framework分析——ActivityManagerService的启动和对Activity的管理 ,目前mStacks中只有mHomeStack这个ActivityStacK。
step6,
boolean startHomeActivityLocked(int userId) { if (mHeadless) { // Added because none of the other calls to ensureBootCompleted seem to fire // when running headless. ensureBootCompleted(); return false; } Intent intent = getHomeIntent(); //HOME intent ActivityInfo aInfo = resolveActivityInfo(intent, STOCK_PM_FLAGS, userId);//查找home应用信息 if (aInfo != null) { intent.setComponent(new ComponentName( aInfo.applicationInfo.packageName, aInfo.name)); // Don't do this if the home app is currently being // instrumented. aInfo = new ActivityInfo(aInfo); aInfo.applicationInfo = getAppInfoForUser(aInfo.applicationInfo, userId); ProcessRecord app = getProcessRecordLocked(aInfo.processName, aInfo.applicationInfo.uid, true);//home应用未启动,返回null if (app == null || app.instrumentationClass == null) { intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_NEW_TASK); mStackSupervisor.startHomeActivity(intent, aInfo); //step7 } } return true; } Intent getHomeIntent() { Intent intent = new Intent(mTopAction, mTopData != null ? Uri.parse(mTopData) : null); intent.setComponent(mTopComponent); if (mFactoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL) { intent.addCategory(Intent.CATEGORY_HOME);//Home应用的标志 } return intent; } step7~step10,Activity的启动过程参照Android4.4 Framework分析——Launcher中启动应用程序(startActivity)的过程
的step14之后的过程。 step11~step14,开始异步加载应用图标,工作线程sWorkerThread。 step15~step20,加载workspace的图标,step16读取LauncherProvider的Favorites数据,favorites表的数据是Launcher数据库创建时从default_workspace.xml解析读取的。step18绑定图标信息。 step22,睡眠等待空闲进程,然后加载主菜单的所有app图标。 step23,从睡眠中醒来,准备加载所有app图标,包括widget等。 step24,
private void loadAllApps() { final long loadTime = DEBUG_LOADERS ? SystemClock.uptimeMillis() : 0; ..... final PackageManager packageManager = mContext.getPackageManager(); final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); //在PackageManagerService查询所有要显示在桌面上的app mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); // Clear the list of apps mBgAllAppsList.clear(); // Query for the set of apps final long qiaTime = DEBUG_LOADERS ? SystemClock.uptimeMillis() : 0; List
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
|
|
来自: quasiceo > 《android定制》