Activity启动流程调用链总结

act启动流程:
第一部分:开始请求执行启动Activity


MyActivity.startActivity() 
Activity.startActivity() 
Activity.startActivityForResult()
Instrumentation.execStartActivty()
ActivityManagerNative.getDefault().startActivity()


1:ActivityManagerNative.getDefault()代码如下:
private static final Singleton<IActivityManager> gDefault = new Singleton<IActivityManager>() {
        protected IActivityManager create() {
            IBinder b = ServiceManager.getService("activity");//获取 AMS 对象
            if (false) {
                Log.v("ActivityManager", "default service binder = " + b);
            }
            IActivityManager am = asInterface(b);
            if (false) {
                Log.v("ActivityManager", "default service = " + am);
            }
            return am;
        }
    };
2:asInterface(b)代码如下:
static public IActivityManager asInterface(IBinder obj) {
        if (obj == null) {
            return null;
        }
        IActivityManager in =
            (IActivityManager)obj.queryLocalInterface(descriptor);
        if (in != null) {
            return in;
        }


        return new ActivityManagerProxy(obj);
    }
3:
ActivityManagerNative.getDefault().startActivity()
ActivityManagerProxy.startActivity()
mRemote(AMS).transact()
AMS.onTranct()
super(ActivityManagerNative).onTranct()
(AMS).startActivity()
(AMS).startActivityAsUser()
4:
在系统进程一侧:
(1):最上层的有IActivityManager的接口定义,图中只列出了少数成员函数作为示意;
(2):往下一层,有两个接口的实现,其中一个ActivityManagerNative作为服务端的“桩(Stub)”,其主要职责就是对远程传递过来的数据进行”反序列化(unparcel)”; 
(3):另一个ActivityManagerProxy作为服务的“代理(Proxy)”,运行在客户端,其主要职责就是将数据进行“序列化(parcel)”,再传递给远程的“桩(Stub)”;
(4):再下一层,就是接口的具体业务实现AMS了,对“桩(Stub)”做了继承扩展


在应用进程一侧:
(1):最上层的有IApplicationThread的接口定义;
(2):往下一层,有两个接口的实现,其中一个ApplicationThreadNative,ApplcationThreadProxy; 
(3):具体业务的实现类是ApplicationThread是ActivityThread的一个内部类,
ApplicationThread负责响应系统进程发起的请求,这些请求大部分都是需要调度在应用进程的主线程执行,
而ActivityThread是应用进程的主线程,通过Handle往主线程抛消息,
ApplicationThread就轻松将具体执行任务的工作转交给了主线程


第二部分:ActivityManagerService接收启动Activity的请求


ActivityManagerService.startActivity() 
ActvityiManagerService.startActivityAsUser() 
ActivityStackSupervisor.startActivityMayWait() 
ActivityStackSupervisor.startActivityLocked() 
ActivityStackSupervisor.startActivityUncheckedLocked() 
ActivityStack.startActivityLocked()
ActivityStackSupervisor.resumeTopActivitiesLocked() 
ActivityStack.resumeTopActivityLocked()
ActivityStackSupervisor.resumeTopActivityInnerLocked() 
ActivityStack.startPausingLocked()


第三部分:执行栈顶Activity的onPause方法


ActivityStack.startPausingLocked() 
ActivityRecord.app.thread.schedulePauseActivity()
ActivityThread.sendMessage() 
ActivityThread.H.sendMessage(); 
ActivityThread.H.handleMessage() 
ActivityThread.handlePauseActivity() 
ActivityThread.performPauseActivity() 
Instrumentation.callActivityOnPause()
Activity.performPause() 
Activity.onPause() 
ActivityManagerNative.getDefault().activityPaused(token) (通知系统进程顶部的Activity已经处于暂停状态)
ActivityManagerService.activityPaused() 
ActivityStack.activityPausedLocked() 
ActivityStack.completePauseLocked() 
ActivityStack.resumeTopActivitiesLocked() 
ActivityStack.resumeTopActivityLocked() 
ActivityStack.resumeTopActivityInnerLocked() 
ActivityStack.startSpecificActivityLocked()


1:关于:ActivityRecord.app.thread.schedulePauseActivity()
ActivityRecord.ProcessRecord.IApplicationThread.schedulePauseActivity()
IApplicationThread thread = ApplicationThreadNative.asInterface(data.readStrongBinder())
ApplicationThreadProxy.schedulePauseActivity()
mRemote(ApplicationThread).transact()
ApplicationThread.onTranct()
ApplicationThreadNative.onTranct()
ApplicationThread.schedulePauseActivity()



第四部分:启动Activity所属的应用进程


ActivityManagerService.startProcessLocked() 
Process.start() 
ActivityThread.main() 
ActivityThread.attach() 
ActivityManagerNative.getDefault().attachApplication() 
ActivityManagerService.attachApplication() 
IApplicationThread.bindApplication()
ActivityThread.sendMessage() 
ActivityThread.H.sendMessage(); 
ActivityThread.H.handleMessage() 
ActivityThread.handleBindApplication()






1:ActivityThread.main()中代码如下:
Looper.prepareMainLooper();
ActivityThread thread = new ActivityThread();
         thread.attach(false);
         Looper.loop();
    2:ActivityThread.attach中代码如下:
    final IActivityManager mgr = ActivityManagerNative.getDefault();
    mgr.attachApplication(mAppThread);
    AMS.attachApplication()
    3:AMS.attachApplication代码如下:
    IApplicationThread.bindApplication()
    ApplicationThread.bindApplication()
   
    4:在IApplicationThread.bindApplication()中:
    ActivityThread.mH.sendMessage()
    ActivityThread.mH.handleMessage(BIND_APPLICATION);
    ActivityThread.handleBindApplication()
    if (data.appInfo.targetSdkVersion <= android.os.Build.VERSION_CODES.HONEYCOMB_MR1) {
            AsyncTask.setDefaultExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
        }
        mInstrumentation = (Instrumentation)
                    cl.loadClass(data.instrumentationName.getClassName()).newInstance();
    app = mActivityThread.mInstrumentation.newApplication(
                    cl, appClass, appContext);
                    
        Instrumentation.callApplicationOnCreate(app);
        Application.onCreate();
        
   
   
     


第五部分:执行启动Acitivity


ActivityStackSupervisor.attachApplicationLocked() 
ActivityStackSupervisor.realStartActivityLocked() 
IApplicationThread.scheduleLauncherActivity() 
ActivityThread.sendMessage() 
ActivityThread.H.sendMessage() 
ActivityThread.H.handleMessage() 
ActivityThread.handleLauncherActivity() 
ActivityThread.performLauncherActivity() 
Instrumentation.callActivityOnCreate() 
Activity.onCreate() 
ActivityThread.handleResumeActivity() 
ActivityThread.performResumeActivity() 
Activity.performResume() 
Instrumentation.callActivityOnResume() 
Activity.onResume() 
ActivityManagerNative.getDefault().activityResumed(token) 


1:在ActivityThread.handleLauncherActivity中
Activity a = performLaunchActivity(r, customIntent);
handleResumeActivity(r.token, false, r.isForward);
2:在ActivityThread.performLauncherActivity()中:
activity = mInstrumentation.newActivity(
                    cl, component.getClassName(), r.intent);
            Instrumentation.callActivityOnCreate(activity, r.state);
            Activity.onCreate() 
            activity.performStart();
            Instrumentation.callActivityOnStart()
            Activity.onStart() 
            mInstrumentation.callActivityOnRestoreInstanceState(activity, r.state);


第六部分:栈顶Activity执行onStop方法


Looper.myQueue().addIdleHandler(new Idler()) 
Idler.queueIdle() 
ActivityManagerNative.getDefault().activityIdle() 
ActivityManagerService.activityIdle() 
ActivityStackSupervisor.activityIdleInternalLocked() 
ActivityStack.stopActivityLocked() 
IApplicationThread.scheduleStopActivity() 
ActivityThread.scheduleStopActivity() 
ActivityThread.sendMessage() 
ActivityThread.H.sendMessage() 
ActivityThread.H.handleMessage() 
ActivityThread.handleStopActivity() 
ActivityThread.performStopActivityInner() 
ActivityThread.callCallActivityOnSaveInstanceState() 
Instrumentation.callActivityOnSaveInstanceState() 
Activity.performSaveInstanceState() 
Activity.onSaveInstanceState() 
Activity.performStop() 
Instrumentation.callActivityOnStop() 
Activity.onStop() 





















































  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值