ActivityThread启动源码解析
来源:互联网 发布:java服务器路径怎么写 编辑:程序博客网 时间:2024/06/18 11:34
https://github.com/android/platform_frameworks_base/blob/master/core/java/android/app/ActivityThread.java
1.启动,走attach
ActivityThread thread = new ActivityThread();
thread.attach(false);
2 获取一个代理,则进入AMS查看attachApplication
final IActivityManager mgr = ActivityManager.getService();
mgr.attachApplication(mAppThread);
3 thread.bindApplication 这里thread指的是ActivityThread种的IApplicationThread
4 ApplicationThread 继承IApplicationThread
进入ApplicationThread bindApplication
sendMessage(H.BIND_APPLICATION, data);
mH.sendMessage(msg);
5final H mH = new H();
所以找一下H这个类,就是Handler
这里启动Activity生命周期都是一个套路
ApplicationThread 调用 IApplicationThread定义的接口
这里是bindApplication.生命周期是schedulexxx
给H发msg
回调 ActivityThread handlerxxx
performxxx
case BIND_APPLICATION:
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, “bindApplication”);
AppBindData data = (AppBindData)msg.obj;
handleBindApplication(data);
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
break;
Application app = data.info.makeApplication(data.restrictedBackupMode, null);
mInitialApplication = app;
mInstrumentation.callApplicationOnCreate(app);
data.info = getPackageInfoNoCheck(data.appInfo, data.compatInfo);
这里知道LoadedApk怎么创建的
Application怎么创建的
public final LoadedApk peekPackageInfo(String packageName, boolean includeCode) {
synchronized (mResourcesManager) {
WeakReference ref;
if (includeCode) {
ref = mPackages.get(packageName);
} else {
ref = mResourcePackages.get(packageName);
}
return ref != null ? ref.get() : null;
}
}
好的,总结一下,这里Application在LoadedApk创建,
LoadedApk存在Map类型的数据结构,以包名也就是一个进程对应一个
public Application makeApplication(boolean forceDefaultAppClass,
Instrumentation instrumentation) {
if (mApplication != null) {
return mApplication;
}
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "makeApplication"); Application app = null; String appClass = mApplicationInfo.className; if (forceDefaultAppClass || (appClass == null)) { appClass = "android.app.Application"; } try { java.lang.ClassLoader cl = getClassLoader(); if (!mPackageName.equals("android")) { Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "initializeJavaContextClassLoader"); initializeJavaContextClassLoader(); Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); } ContextImpl appContext = ContextImpl.createAppContext(mActivityThread, this); app = mActivityThread.mInstrumentation.newApplication( cl, appClass, appContext); appContext.setOuterContext(app); } catch (Exception e) { if (!mActivityThread.mInstrumentation.onException(app, e)) { Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); throw new RuntimeException( "Unable to instantiate application " + appClass + ": " + e.toString(), e); } } mActivityThread.mAllApplications.add(app); mApplication = app; if (instrumentation != null) { try { instrumentation.callApplicationOnCreate(app); } catch (Exception e) { if (!instrumentation.onException(app, e)) { Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); throw new RuntimeException( "Unable to create application " + app.getClass().getName() + ": " + e.toString(), e); } } } // Rewrite the R 'constants' for all library apks. SparseArray<String> packageIdentifiers = getAssets().getAssignedPackageIdentifiers(); final int N = packageIdentifiers.size(); for (int i = 0; i < N; i++) { final int id = packageIdentifiers.keyAt(i); if (id == 0x01 || id == 0x7f) { continue; } rewriteRValues(getClassLoader(), packageIdentifiers.valueAt(i), id); } Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); return app;}
Instrumentation
public Application newApplication(Class
- ActivityThread启动源码解析
- ActivityThread解析
- Android源码解析四大组件系列(三)---Activity启动过程之ActivityThread是如何运行起来的
- ActivityThread-activity启动分析
- ActivityThread-activity启动分析
- ActivityThread 源码笔记(1)
- ActivityThread源码分析
- ActivityThread.java源码
- 源码分析 -- ActivityThread
- Activity启动分析(一)--ActivityThread
- ActivityThread
- ActivityThread
- openfire启动源码解析
- Activity启动创建 (AcitivtyManageService,ActivityThread,Activity)
- Activity启动创建 (AcitivtyManageService,ActivityThread,Activity)
- 关于ActivityThread和ApplicationThread的解析
- phpcmsv9启动部分源码解析
- Android 进程启动源码解析
- 剑指offer(24)—二叉树中和为某一值的路径
- 年度总结
- SQL 简单查询
- 速度版运动框架(获得属性+requestAnimationFrame请求动画帧)
- 群体智能优化算法之粒子群优化算法
- ActivityThread启动源码解析
- Linux运维攻城狮必会的10大工具
- 局部最小值位置、元素最左出现、循环有序数组最小值
- 搜狐2017校招编程题
- Android基本布局与控件(待完善)
- 2073活动选择问题
- MySQL多版本并发控制分析 事务
- 【搜狐8.28】装箱子
- 冒泡排序代码