文章记录一个大概的流程,方便以后参考
【packages/apps/Launcher3/src/com/android/launcher3】
我们在桌面点击 APP 的icon点击事件就是在这儿的onClick()里发起的
public class ItemClickHandler {
private static void onClick(View v) {
//...
// Start activities
startAppShortcutOrInfoActivity(v, shortcut, launcher);
}
}
方法的调用链:
【Launcher.java】
Launcher. startActivitySafely()//内部调用父类的startActivitySafely()方法
【--->BaseDraggingActivity.java】
BaseDraggingActivity.startActivitySafely()//调用Activity 的startActivity()方法
【--->Activity.java】
进入Activity
Activity.startActivity()
//...
Activity.startActivityForResult()//调用Instrumentation.execStartActivity()方法
【--->Instrumentation.java】
至此,我们在 launcher 进程的桌面中点击 icon, 执行到Instrumentation.execStartActivity()方法
public class Instrumentation {
public ActivityResult execStartActivity(
Context who, IBinder contextThread, IBinder token, Activity target,
Intent intent, int requestCode, Bundle options) {
IApplicationThread whoThread = (IApplicationThread) contextThread;
//...
try {
//这儿
//whoThread :launcher 进程中ActivityThread的ApplicationThread 对象,它是一个IApplicationThread类型的
//intent : 跳转的信息
int result = ActivityManager.getService()
.startActivity(whoThread, who.getBasePackageName(), intent,
intent.resolveTypeIfNeeded(who.getContentResolver()),
token, target != null ? target.mEmbeddedID : null,
requestCode, 0, null, options);
} catch (RemoteException e) {
}
return null;
}
}
ActivityManager.getService()获取到 AMS 的代理对象,执行startActivity()
接着就进入到 AMS 的 startActivity() 方法
【--->ActivityManagerService.java】
ActivityManagerService.startActivity()
//...
ActivityManagerService.startActivityAsUser()//execute()
【--->ActivityStarter.java】
ActivityStarter.execute()
//
ActivityStarter.startActivityMayWait()
//
ActivityStarter.startActivity()
//
ActivityStarter.startActivityUnchecked()//调用resumeFocusedStackTopActivityLocked()
//
【--->ActivityStackSupervisor.java】
ActivityStackSupervisor.resumeFocusedStackTopActivityLocked()
//调用ActivityStack.resumeTopActivityUncheckedLocked()
【--->ActivityStack.java】
ActivityStack.resumeTopActivityUncheckedLocked()
//
ActivityStack.resumeTopActivityInnerLocked()//方法内部两个流程
//流程1. pause 当前的 activity
ActivityStack.startPausingLocked
//流程2.创建进程
//调用 ActivityStackSupervisor.startSpecificActivityLocked()
再次回到ActivityStackSupervisor
【--->ActivityStackSupervisor.java】
public class ActivityStackSupervisor {
//...
void startSpecificActivityLocked(ActivityRecord r,
boolean andResume, boolean checkConfig) {
//从AMS中查询将要启动的Activity的进程是否存在
// Is this activity's application already running?
ProcessRecord app = mService.getProcessRecordLocked(r.processName,
r.info.applicationInfo.uid, true);
getLaunchTimeTracker().setLaunchTime(r);
//如果应用进程已经存在
if (app != null && app.thread != null) {
try {
//...
//如果是 APP 内启动新 Activity 则执行这个分支
realStartActivityLocked(r, app, andResume, checkConfig);
//return 下面的不会执行了
return;
} catch (RemoteException e) {
}
}
//launcher 启动 APP 执行这个逻辑
//进程不存在,通过AMS调用startProcessLocked向Zygote进程发送请求
mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0,
"activity", r.intent.getComponent(), false, false, true);
}
}
应用进程的创建过程,这里不说,APP进程创建之后 入口是 ActivityThread 的 Main()
此时 APP 进程起来了 ,我们的逻辑在 APP进程内,目前涉及到的进程
Launcher进程 :A
AMS 进程 :B
APP 进程 :C
然后APP进程 C 初始化
public final class ActivityThread extends ClientTransactionHandler {
public static void main(String[] args) {
//...
Looper.prepareMainLooper();
ActivityThread thread = new ActivityThread();
//ActivityThread的attach()
thread.attach(false, startSeq);
if (sMainThreadHandler == null) {
sMainThreadHandler = thread.getHandler();
}
//...
Looper.loop();
}
private void attach(boolean system, long startSeq) {
sCurrentActivityThread = this;
mSystemThread = system;
//...
if (!system) {
final IActivityManager mgr = ActivityManager.getService();
try {
//AMS绑定ApplicationThread对象
//APP 进程和AMS进程开始通信通信
mgr.attachApplication(mAppThread, startSeq);
} catch (RemoteException ex) {
}
} else {
}
//...
}
}
【--->AMS.java】
ActivityManagerService.attachApplication()
//
ActivityManagerService.attachApplicationLocked()
//1. thread.bindApplication
//2.mStackSupervisor.attachApplicationLocked(app) 分析这一步
再次回到ActivityStackSupervisor
【--->ActivityStackSupervisor.java】
public class ActivityStackSupervisor {
boolean attachApplicationLocked(ProcessRecord app) throws RemoteException {
final String processName = app.processName;
boolean didSomething = false;
for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
final ActivityDisplay display = mActivityDisplays.valueAt(displayNdx);
for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) {
if (activity.app == null && app.uid == activity.info.applicationInfo.uid
&& processName.equals(activity.processName)) {
try {
//还是到这儿
if (realStartActivityLocked(activity, app,
top == activity /* andResume */, true /* checkConfig */)) {
didSomething = true;
}
} catch (RemoteException e) {
}
}
}
}
return didSomething;
}
}
【--->ActivityThread.java】
ActivityThread.handleLaunchActivity()
//
ActivityThread.performLaunchActivity()//通过反射创建 activity
// 依次回调 activity 的
Activity.attach()
Activity.onCreate()
Activity.start()
Activity.onResume()
见相关文章
更多内容 欢迎关注公众号
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。