Launcher 启动流程
1 启动Launcher在之前分析了一下SystemServer源码,最后启动boot/core/other … Service,在startOtherService 中,有调用到 mActivityManagerService.systemReady();
mActivityManagerService.systemReady(
new Runnable() {
@Override
public void run() {
Slog.i(TAG,
"Making services ready");
mSystemServiceManager.startBootPhase(
SystemService.PHASE_ACTIVITY_MANAGER_READY);
try { mActivityManagerService.startObservingNativeCrashes();
}
catch (Throwable e) {
reportWtf(
"observing native crashes", e);
}
try {
startSystemUi(context);
}
catch (Throwable e) {
reportWtf(
"starting System UI", e);
}
try {
if (networkScoreF !=
null) networkScoreF.systemReady();
}
catch (Throwable e) {
reportWtf(
"making Network Score Service ready", e);
}
try {
if (networkManagementF !=
null) networkManagementF.systemReady();
}
catch (Throwable e) {
reportWtf(
"making Network Managment Service ready", e);
}
try {
if (networkStatsF !=
null) networkStatsF.systemReady();
}
catch (Throwable e) {
reportWtf(
"making Network Stats Service ready", e);
}
try {
if (networkPolicyF !=
null) networkPolicyF.systemReady();
}
catch (Throwable e) {
reportWtf(
"making Network Policy Service ready", e);
}
try {
if (connectivityF !=
null) connectivityF.systemReady();
}
catch (Throwable e) {
reportWtf(
"making Connectivity Service ready", e);
}
try {
if (audioServiceF !=
null) audioServiceF.systemReady();
}
catch (Throwable e) {
reportWtf(
"Notifying AudioService running", e);
}
Watchdog.getInstance().start();
}
});
}
通过源码可以看到其中大多是系统服务systemReady()操作,重点关注一下Launcher所进行的操作流程,ActivityManagerService.systemReady();
public void systemReady(final Runnable goingCallback) {
...... 各种校验 System ready 情况
......
Slog
.i(
TAG,
"System now ready");
retrieveSettings();
loadResourcesOnSystemReady();
mBooting
= true;
startHomeActivityLocked(mCurrentUserId,
"systemReady");
......
}
这里主要是校验各种System ready 情况,最后调用startHomeActivityLocked();
boolean startHomeActivityLocked(
int userId, String reason) {
if (mFactoryTest == FactoryTest.FACTORY_TEST_LOW_LEVEL
&& mTopAction ==
null) {
return false;
}
Intent intent = getHomeIntent();
ActivityInfo aInfo =
resolveActivityInfo(intent, STOCK_PM_FLAGS, userId);
if (aInfo !=
null) {
intent.setComponent(
new ComponentName(
aInfo.applicationInfo.packageName, aInfo.name));
aInfo =
new ActivityInfo(aInfo);
aInfo.applicationInfo = getAppInfoForUser(aInfo.applicationInfo, userId);
ProcessRecord app = getProcessRecordLocked(aInfo.processName,
aInfo.applicationInfo.uid,
true);
if (app ==
null || app.instrumentationClass ==
null) {
intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_NEW_TASK);
mStackSupervisor.startHomeActivity(intent, aInfo, reason);
}
}
return true;
}
Intent getHomeIntent() {
Intent intent =
new Intent(mTopAction, mTopData !=
null ? Uri.parse(mTopData) :
null);
intent.setComponent(mTopComponent);
if (mFactoryTest != FactoryTest.FACTORY_TEST_LOW_LEVEL) {
intent.addCategory(Intent.CATEGORY_HOME);
}
return intent;
}
这里很清晰,先通过getHomeIntent获取 Intent之后,startHomeActivity进行start。而了Intent.CATEGORY_HOME常量是Android的androidmanifest.xml清单文件中的常量。
void startHomeActivity(Intent intent, ActivityInfo aInfo, String reason) {
moveHomeStackTaskToTop(HOME_ACTIVITY_TYPE, reason);
startActivityLocked(
...);
if (inResumeTopActivity) {
scheduleResumeTopActivities();
}
}
最后调用到的是startActivityLocked(),这里其实启动的是清单文件中声明的Launcher的Activity类
2.LauncherActivity
LauncherActivity 继承自 ListActivity,layout 文件十分简单,一个ListView,一个TextView,从生命周期OnCreate()来看
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
mPackageManager = getPackageManager();
if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_WATCH)) {
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setProgressBarIndeterminateVisibility(
true);
}
onSetContentView();
mIconResizer =
new IconResizer();
mIntent =
new Intent(getTargetIntent());
mIntent.setComponent(
null);
mAdapter =
new ActivityAdapter(mIconResizer);
setListAdapter(mAdapter);
getListView().setTextFilterEnabled(
true);
updateAlertTitle();
updateButtonText();
if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_WATCH)) {
setProgressBarIndeterminateVisibility(
false);
}
}
* 其中 getPackageManager() 是获取应用列表,以及应用信息,并将数据注入Adapter,显示到桌面。
protected void onListItemClick(ListView l, View v,
int position,
long id) {
Intent intent = intentForPosition(position);
startActivity(intent);
}
在点击图标的点击事件回调中,将Intent取出来后,并启动Activity.至此启动应用。Launcher 启动结束。