Looper这个东东很重要,线程之间的通信全靠它,Activity能运行起来也是因为它
下面是启动时的方法调用:
Instrumentation.callActivityOnCreate(Activity, Bundle) line: 1079
ActivityThread.performLaunchActivity(ActivityThread$ActivityClientRecord, Intent) line: 2023
ActivityThread.handleLaunchActivity(ActivityThread$ActivityClientRecord, Intent) line: 2084
ActivityThread.access$600(ActivityThread, ActivityThread$ActivityClientRecord, Intent) line: 130
ActivityThread$H.handleMessage(Message) line: 1195
ActivityThread$H(Handler).dispatchMessage(Message) line: 99
Looper.loop() line: 137
ActivityThread.main(String[]) line: 4745
ThradActivity:
public static void main(String[] args) {
SamplingProfilerIntegration.start();
// CloseGuard defaults to true and can be quite spammy. We
// disable it here, but selectively enable it later (via
// StrictMode) on debug builds, but using DropBox, not logs.
CloseGuard.setEnabled(false);
Process.setArgV0("<pre-initialized>");
Looper.prepareMainLooper();
if (sMainThreadHandler == null) {
sMainThreadHandler = new Handler();
}
//这里的线程应该就是所谓的UI线程,每个线程有自己的Looper, 用Handler的sendMessage可以向Looper的
//消息队列加消息,Handler在初始化里会找到当前的线程并加与之对应的Looper的消息队列取到,
//这样其它线程就可以给它发送消息,而Looper里面的loop方法会不停的执行处理消息,这样来处理线程之间的通信
ActivityThread thread = new ActivityThread();
thread.attach(false);//这里完成部分初始化
AsyncTask.init();
if (false) {
Looper.myLooper().setMessageLogging(new
LogPrinter(Log.DEBUG, "ActivityThread"));
}
Looper.loop();//这是个死循环,它里面有个消息队列,它不停的遍历并处理消息,它会触发主Activity的加载
throw new RuntimeException("Main thread loop unexpectedly exited");
}
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");
ActivityClientRecord r = (ActivityClientRecord)msg.obj;
r.packageInfo = getPackageInfoNoCheck(
r.activityInfo.applicationInfo, r.compatInfo);
handleLaunchActivity(r, null);//处理启动Activity
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
} break;
performLaunchActivity会完成Activity的加载
Activity activity = null;
try {
java.lang.ClassLoader cl = r.packageInfo.getClassLoader();
//加载Activity
activity = mInstrumentation.newActivity(
cl, component.getClassName(), r.intent);
StrictMode.incrementExpectedActivityCount(activity.getClass());
r.intent.setExtrasClassLoader(cl);
if (r.state != null) {
r.state.setClassLoader(cl);
}
}
attach方法会完成Activity主窗口的创建
activity.attach(appContext, this, getInstrumentation(), r.token,
r.ident, app, r.intent, r.activityInfo, title, r.parent,
r.embeddedID, r.lastNonConfigurationInstances, config);
activity.mCalled = false;
mInstrumentation.callActivityOnCreate(activity, r.state);会触发Activity的onCreate事件
Activity:
mWindow = PolicyManager.makeNewWindow(this);
View之类的组件是在setContentView时才开始绘的
下面以PhoneWindow为例:
public void setContentView(View view, ViewGroup.LayoutParams params) {
if (mContentParent == null) {
installDecor();//这里才是用于显示的窗,decor它是一个FrameLayout,可以看下里面的chrild
} else {
mContentParent.removeAllViews();
}
mContentParent.addView(view, params);
final Callback cb = getCallback();
if (cb != null && !isDestroyed()) {
cb.onContentChanged();
}
}
分享到:
相关推荐
Android webview 加载网页以及本地资源以及SD资源demo,以及加载缓存资源
使用Glide在Android中加载SVG
可直接运行,方便直接添加到项目中 解决了android 加载Html页面只出现文字,图片加载不出来,直接显示小方块的问题
Android的关于高德地图加载谷歌瓦片,并缓存本地的功能. 以及加载多个Marker的title都显示在地图的Demo. Android studio 3.0
Android WebView 加载 PDF 文件实现。其原理就是在 app 本地搭建一个 website ,然后利用 WebView 加载这个站点,站点去实现加载显示 PDF 的目的,站点其原理也是采用 js 框架去实现的。
类似于淘宝消息,网易云课堂的内容预加载效果,先闪烁显示内容占据的区域,等加载完成后显示实际内容。
Android 强大的图片加载类 图库效果,详细的Handler操作案例。
Android类加载机制、插件化、热修复相关内容。Android类加载机制、插件化、热修复相关内容。Android类加载机制、插件化、热修复相关内容。Android类加载机制、插件化、热修复相关内容。Android类加载机制、插件化、...
Android webview加载网页
Android图片加载&使用介绍
Android 加载assets文件夹的文本文件 图片
这是一个Android异步图片加载的例子
android动态加载dex so加载类库
Android NDK开发动态加载so,采用System.load方法实现
android 图片加载优化 解决的OOM异常
android webView加载html 并引用本地资源(图片、字体库)
android 各种加载动画效果 现在免费分享给大家 希望大家可以喜欢!
android移动开发,分页加载数据实例,介绍了listView上拉如何加载数据。
Android图片加载框架类似Glide
演化理解 Android 异步加载图片