android framework Activity的启动流程

startActivity --> ActivityManagerNative.getDefault().startActivity 
mRemote.transact(_
startActivity 
ActivityManagerNative.getDefault().startActivity// 拿到AMS的binder对象,
//然后调用startActivity
mRemote.transact(START_ACTIVITY_TRANSACTION,data,reply,0);
//将所有的请求参数
//封装parcel里面然后写入到binder驱动。binder驱动转发到AMS
//AMS就能收到onTransact回调,然后onTransact回调就能收到请求参数。 

public boolean onTransact(int code,Parcel data,Parcel reply,int flags){
//取出data,然后根据code请求码处理请求
    switch(code){
        case START_ACTIVITY_TRANSACTION:{
            startActivity(app,callingPackage,intent,...);//startActivity
        }
    }
    ...
}
AMS处理startActivity
首先经过ActivityStarter.java
mLastStartActivityResult = startActivityUnchecked(r, sourceRecord, voiceSession,
        request.voiceInteractor, startFlags, true /* doResume */, checkedOptions, inTask,
        restrictedBgActivity, intentGrants);
--->startActivityInner() --> 
ActivityStack.java startActivityLocked() --> 
        
void startSpecificActivity(ActivityRecord r,...){
    ProcessRecord app = mService.getProcessRecordLocked(r.processName,...);
    //查看应用进程真的启动了没有
    
    if(app!=null && app.thread!=null){//当前的ProcessRecord 不为 null ApplicationThread 不是null
        realStartActivityLocked(r,app,...);//启动activity
        return;
    }
    mService.startProcessAsync(r.processName,...);
}

启动activity
void startProcessLocked(ProcessRecord app){
    if(entryPoint ==null) entryPoint = "android.app.ActivityThread";
    //应用进程启动之后入口函数的java类
    Process.ProcessStartResult startResult = Process.start(entryPoint,...);
    //向zygote发送一个启动进程的请求,回到上entryPoint
    
    synchronized(mPidsSelfLocked){
        mPidSelfLocked.put(startResult.pid,app);//pid等信息
        Message msg = mHandler.obtainMessage(PROC_START_TIMEOUT_MSG);
        msg.obj = app;
        //应用进程启动之后没有向AMS报告就会超时,
        //超时事件定义是10s,超时就会清理应用相关的信息
        mHandler.sendMessageDelayed(msg,PROC_START_TIMEOUT);
        
    }
}

public static final ProcessStartResult start(final String processClass,...){
    return startViaZygote(processClass);
}

ProcessStartResult startViaZygote(final String processClass,...){
    //1.打开 zygote 的socket
    //2.通过socket 发送启动进程参数并且得到返回结果
    return zygoteSendArgsAndGetResult(openZygoteSocketIfNeeded(abi),argsForZygote);
}
//zygote的函数处理
boolean runOnce(){
    String[] args = readArgumentList( );//读取参数列表
    int pid = Zygote.forkAndSpecialize(...);//创建子进程
    
    if(pid==0){
        //初始化,启用binder机制,应用的入口函数ActivityThread.main
        handleChildProc(parsedArgs,...);
        return true;
    }else{
        //将子进程的pid通过socket返回给AMS
        return handleParentProc(pid,...);
    }
}

public static void main(String[] args){
    Looper.prepareMainLooper();
    
    ActivityThread thread = new ActivityThread();
    thread.attach(false);//向AMS报告
    
    Looper.loop();
    throw new RuntimeException("Main loop exit...")
}

private void attach(boolean system){ 
    IActivityManager mgr - AcitivtyManagerNative.getDefault();
    mgr.attachApplication(mAppThread);
}

这个是本人总结的,mkw的framework面试的资料,需要具体的视频和其他的资料,TB店铺 纳新工作室  中找framework 资料就好哈。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值