Activity启动分析
来源:互联网 发布:js 禁用input select 编辑:程序博客网 时间:2024/05/01 21:41
今天我们来分析一下Activity的启动流程:
当用户手指触摸到我们手机屏幕上的icon的时候,这时候我们的程序会进入到我们的入口类中
ActivityThread,当然也像大多数程序一样,比如C、C++,Java都会有一个main方法,我们的Activity中也有一个main方法
我们在这里看到我们在子线程中调用了Looper.prepare()和Looper.loop()去创建一个消息循环去不断地循环,
这也就解释了我们,为什么在主线程中我们就不用去Looper.prepare()和Looper.loop(),因为我们在ActivityThread中的main方法中已经
开启了一个消息循环。
2.我们在main方法中创建了消息循环后,会去执行该类的attach方法,
去调用ActivityManageNative的getDefault()方法
我们的getDefault()方法干了些什么呢?
原来我们从ServiceManager取出getService("activity");
既然我们有getService,那么有没有setService,或者addService呢?带着猎奇的态度我们去看一下,果然我们在ActivityManagerService中找到了
mStackSupervisor.attachApplicationLocked-->realStartActivityLocked(hr, app, true, true)
5. 接着又回到我们的ActivityThread中的scheduleLaunchActivity方法,通过scheduleLaunchActivity进行一些配置
并且发送了message,接下来就是处理这些消息了handleLaunchActivity
这里面配置一些window信息,初始化之类的,比较重要的代码
在performLaunchActivity中会调用Instrumentation类的
mInstrumentation.newActivity();
在Instrumentation中会通过反射拿到一个Activity对象并且返回给ActivityThread
然后在ActivityThread中调用Instrumentation对象的callActivityOnCreate(将activity传递过去)
mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
在callActivityOnCreate中会去调用
结合下面的流程图应该更好理解
当用户手指触摸到我们手机屏幕上的icon的时候,这时候我们的程序会进入到我们的入口类中
ActivityThread,当然也像大多数程序一样,比如C、C++,Java都会有一个main方法,我们的Activity中也有一个main方法
1.首先Activity会调用该类中的main方法,来做一些前期的启动分析工作,比如
Looper.prepareMainLooper()和
Looper.loop()我们一般在主线程中使用handler的时候是下面这样的
Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { //处理消息 } };
然而我们在子线程中,假如我们要和主线程去传递消息我们必须这样:
//开启一个子线程 new Thread(new Runnable() { @Override public void run() { Looper.prepare(); Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { //处理消息 } }; Looper.loop(); } }).start();
我们在这里看到我们在子线程中调用了Looper.prepare()和Looper.loop()去创建一个消息循环去不断地循环,
这也就解释了我们,为什么在主线程中我们就不用去Looper.prepare()和Looper.loop(),因为我们在ActivityThread中的main方法中已经
开启了一个消息循环。
2.我们在main方法中创建了消息循环后,会去执行该类的attach方法,
ActivityThread thread = new ActivityThread();thread.attach(false);
3.我们看一下attach方法,我在这里只挑比较重要的代码
final IActivityManager mgr = ActivityManagerNative.getDefault();
去调用ActivityManageNative的getDefault()方法
我们的getDefault()方法干了些什么呢?
IBinder b = ServiceManager.getService("activity");
原来我们从ServiceManager取出getService("activity");
既然我们有getService,那么有没有setService,或者addService呢?带着猎奇的态度我们去看一下,果然我们在ActivityManagerService中找到了
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)); //其中 Context.ACTIVITY_SERVICE public static final String ACTIVITY_SERVICE = "activity";
4.我们的getDefault方法反回了一个ActivityManagerService,并且将ActivityManagerService对象返回到我们的ActivityThread,
紧接着我们调用了ActivityManagerService的attachApplication
mgr.attachApplication(mAppThread);
并且传过去一个Thread,在 attachApplication中我们调用了ActivityManagerService的attachApplicationLocked,并且将刚才传过来的thread传下去
attachApplicationLocked(thread, callingPid);
做一些基础的检测,比如pid的检查,是否有多个应用程序运行
然后回去调用ActivityStackSupervisor的attachApplicationLocked,
拿到最上面的一个Activity,
ActivityRecord hr = stack.topRunningActivityLocked(null);
mStackSupervisor.attachApplicationLocked-->realStartActivityLocked(hr, app, true, true)
5. 接着又回到我们的ActivityThread中的scheduleLaunchActivity方法,通过scheduleLaunchActivity进行一些配置
ActivityClientRecord r = new ActivityClientRecord(); r.token = token; r.ident = ident; r.intent = intent; r.referrer = referrer; r.voiceInteractor = voiceInteractor; r.activityInfo = info; r.compatInfo = compatInfo; r.state = state; r.persistentState = persistentState; r.pendingResults = pendingResults; r.pendingIntents = pendingNewIntents; r.startsNotResumed = notResumed; r.isForward = isForward; r.profilerInfo = profilerInfo; updatePendingConfiguration(curConfig); sendMessage(H.LAUNCH_ACTIVITY, r);
并且发送了message,接下来就是处理这些消息了handleLaunchActivity
这里面配置一些window信息,初始化之类的,比较重要的代码
6.Activity a = performLaunchActivity(r, customIntent);
在performLaunchActivity中会调用Instrumentation类的
mInstrumentation.newActivity();
在Instrumentation中会通过反射拿到一个Activity对象并且返回给ActivityThread
然后在ActivityThread中调用Instrumentation对象的callActivityOnCreate(将activity传递过去)
mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
在callActivityOnCreate中会去调用
public void callActivityOnCreate(Activity activity, Bundle icicle, PersistableBundle persistentState) { prePerformCreate(activity); activity.performCreate(icicle, persistentState); postPerformCreate(activity); }//最终调用我们的activity的performCreate方法
final void performCreate(Bundle icicle) { onCreate(icicle); mActivityTransitionState.readState(icicle); performCreateCommon(); }
结合下面的流程图应该更好理解
阅读全文
0 0
- Activity启动过程分析
- activity 启动流程分析
- activity启动模式分析
- Activity启动分析
- activity启动方式分析
- ActivityThread-activity启动分析
- ActivityThread-activity启动分析
- activity 启动流程分析
- activity的启动分析
- Activity启动流程分析
- Activity启动过程分析
- Activity 启动流程分析
- Activity启动源码分析
- Activity启动流程分析
- Activity启动过程分析
- Activity启动过程分析
- Activity启动过程分析
- Activity启动过程分析
- 数的长度【南阳 oj 题目69】
- html 列表
- 项目管理工作中的一些自我反省
- C#调用Excel版本不兼容的解决方法
- shell 脚本 文件比较和数值比较
- Activity启动分析
- Dom动态添加事件,不能使用循环变量的问题
- 元素的垂直水平居中的三种方法
- html 布局
- Gradle篇一——groovy基础
- html 表单
- Android系统从加电到Home桌面出现流程分析(基于Android-2.3)
- html 框架
- 【QT】Qt对大小端字节序的处理