App启动流程

241 篇文章 5 订阅

app启动流程图

1、当点击app图标的时候,就会执行ActivivtyThread的main()函数

2、在main函数数中调用ActivityThread的attach()方法

3、在ActivityThread的attach函数中调用getDefault()函数,返回IActivityManager的实例对象

1)ActivityThread main函数中调用getDefaut()函数

final IActivityManager mgr = ActivityManagerNative.getDefault();

2)getDefault是一个单例,返回的是ActivityManagerService

结果是通过IBinder返回的,这里既然有得到service的方法,肯定也有添加service的方法

private static final Singleton<IActivityManager> gDefault = new Singleton<IActivityManager>() {
    protected IActivityManager create() {
        IBinder b = ServiceManager.getService("activity");
        if (false) {
            Log.v("ActivityManager", "default service binder = " + b);
        }
        IActivityManager am = asInterface(b);
        if (false) {
            Log.v("ActivityManager", "default service = " + am);
        }
        return am;
    }
};

3)ActivityManagerService中添加service的方法

public void setSystemProcess() {
    try {
        ServiceManager.addService(Context.ACTIVITY_SERVICE, this, true);
        ServiceManager.addService(ProcessStats.SERVICE_NAME, mProcessStats);
        ServiceManager.addService("meminfo", new MemBinder(this));
        ServiceManager.addService("gfxinfo", new GraphicsBinder(this));
        ServiceManager.addService("dbinfo", new DbBinder(this));
        if (MONITOR_CPU_USAGE) {
            ServiceManager.addService("cpuinfo", new CpuBinder(this));
        }
        ServiceManager.addService("permission", new PermissionController(this));
        ......
   }catch(Exception e){
   }
     ......

}

Context.ACTIVITY_SERVICE = "activity",所以所需要获得的key为activity的service是在这里添加的,取到的就是ActivityManagerService这个类

4、在ActivityThread中调用ActivityManagerService的attachApplication方法,并将自己ActivityThread作为参数

5、在ActivityManagerService的attachApplication方法中调用自己的attachApplicationLocked(ActivityThread activityThread,int pid)方法,并将ActivityThread作为参数传入

6、在ActivityManagerService的attachApplicationLocked方法中调用ActivityThread的bindApplication()方法,用于将ActivityThread与Application进行绑定

7、在ActivityManagerService中的attachApplicationLocked方法中绑定ActivityThread与Application后,紧接着调用ActivityStackSupervisor的attachApplicationLocked(ProcessRecord app)方法,并将ProcessRecord作为参数传过去

在这个方法中做了很多判断,然后根据设定的状态启动activity

8、在ActivityStackSupervisor中调用了realStartActivity这个方法

9、在ActivityStackSupervisor中调用了方法app.thread.scheduleLaunchActivity()

10、在ActivityThread的scheduleLaunchActivity()中调用了方法sendMessage(H.LAUNCH_ACTIVITY,r)

11、在ActivityThread的handMessage()方法中调用了handMessage方法,并执行方法 handleLaunchActivity(r, null);

public void handleMessage(Message msg) {
    if (DEBUG_MESSAGES) Slog.v(TAG, ">>> handling: " + codeToString(msg.what));
    switch (msg.what) {
        case LAUNCH_ACTIVITY: {
            Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityStart");
            final ActivityClientRecord r = (ActivityClientRecord) msg.obj;

            r.packageInfo = getPackageInfoNoCheck(
                    r.activityInfo.applicationInfo, r.compatInfo);
            handleLaunchActivity(r, null);
            Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
        } break;
......

}

}

12、在handlerLaunchActivity()方法中执行performLaunchActivity

private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent) {
    ....
    Activity a = performLaunchActivity(r, customIntent);
         ....

}

 

13、在performLaunchActivity中通过反射来启动activity,通过mInstrumenttation.newActivity()创建了activity

Instrumention这个类负责activity的启动逻辑

private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
   ......

try {
    java.lang.ClassLoader cl = r.packageInfo.getClassLoader();
    activity = mInstrumentation.newActivity(
            cl, component.getClassName(), r.intent);
    StrictMode.incrementExpectedActivityCount(activity.getClass());
    r.intent.setExtrasClassLoader(cl);
    r.intent.prepareToEnterProcess();
    if (r.state != null) {
        r.state.setClassLoader(cl);
    }
} catch (Exception e) {
    if (!mInstrumentation.onException(activity, e)) {
        throw new RuntimeException(
            "Unable to instantiate activity " + component
            + ": " + e.toString(), e);
    }
}
   ......

}

 

14、Instrumentation中的newActivity方法通过反射创建activity,并返回给ActivityThread

public Activity newActivity(Class<?> clazz, Context context, 
        IBinder token, Application application, Intent intent, ActivityInfo info, 
        CharSequence title, Activity parent, String id,
        Object lastNonConfigurationInstance) throws InstantiationException, 
        IllegalAccessException {
    Activity activity = (Activity)clazz.newInstance();
    ActivityThread aThread = null;
    activity.attach(context, aThread, this, token, 0, application, intent,
            info, title, parent, id,
            (Activity.NonConfigurationInstances)lastNonConfigurationInstance,
            new Configuration(), null);
    return activity;
}

 

15、在ActivityThread中的方法performLaunchActivity中,创建activity并返回后,将这个activity放到了一个map集合中

final ArrayMap<IBinder, ActivityClientRecord> mActivities
mActivities.put(r.token, r);

16、在ActivityThread中的方法handleLauanchActivity中,在得到创建的Activity对象后,所有的生命周期方法都是onCreate()调用的

private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent) {
     ......

Activity a = performLaunchActivity(r, customIntent);
if (a != null) {
...

handleResumeActivity(r.token, false, r.isForward,
        !r.activity.mFinished && !r.startsNotResumed);
......

mInstrumentation.callActivityOnPause(r.activity);
...

 }

     ......

}

17、在ActivityThread中的方法performLaunchActivity()中调用Instrumentation的onCreate方法

1)
​​​​​​​private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
   ......

if (r.isPersistable()) {
    mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
} else {
    mInstrumentation.callActivityOnCreate(activity, r.state);
}
   ......

}

2)Instrumentation中调用prePerformCreate()方法调用了activity的onCreate()方法

    public void callActivityOnCreate(Activity activity, Bundle icicle,
            PersistableBundle persistentState) {
        prePerformCreate(activity);
        activity.performCreate(icicle, persistentState);
        postPerformCreate(activity);
    }
 

 

 

 

注:

1、Android与用户的交互是基于消息机制的

2、Android内存模型

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值