public void onClick(View v) { ... Object tag = v.getTag(); if (tag instanceof ShortcutInfo) { onClickAppShortcut(v); } ... } protected void onClickAppShortcut(final View v) { ... // Start activities startAppShortcutOrInfoActivity(v); ... } void startAppShortcutOrInfoActivity(View v) { ... // 得到launcher提供的启动这个app主activity的intent intent = shortcut.intent; ... boolean success = startActivitySafely(v, intent, tag); ... } boolean startActivitySafely(View v, Intent intent, Object tag) { ... success = startActivity(v, intent, tag); ... } private boolean startActivity(View v, Intent intent, Object tag) { intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); ... startActivity(intent, optsBundle); ... }
从以上代码流程可知当Launcher启动一个app时,会在自己的startActivity()方法中为Intent中添加一个FLAG_ACTIVITY_NEW_TASK flag,然后调用继承自Activity的startActivity()方法来进一步启动app。

Activity向AMS发起请求启动App

Activity启动Activity的流程如下,具体可以查看相关的源码,需要注意的是Android 6.0的实现和8.0版本实现有略微的区别。