1.1 ActivityThread工作原理?

=======

1.1 ActivityThread工作原理?

通过前面的学习(复习)我们知道ActivityThread其实不是一个Thread,而是一个final类型的Java类,并且拥有main(String[] args) 方法。Android原生以Java语言为基础,Java的JVM启动的入口就是main(String[] args)。

  1. public static void main(String[] args) {
  2. Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "ActivityThreadMain");
  3. // Install selective syscall interception
  4. AndroidOs.install();
  5. // CloseGuard defaults to true and can be quite spammy. We
  6. // disable it here, but selectively enable it later (via
  7. // StrictMode) on debug builds, but using DropBox, not logs.
  8. CloseGuard.setEnabled(false);
  9. Environment.initForCurrentUser();
  10. // Make sure TrustedCertificateStore looks in the right place for CA certificates
  11. final File configDir = Environment.getUserConfigDirectory(UserHandle.myUserId());
  12. TrustedCertificateStore.setDefaultUserDirectory(configDir);
  13. Process.setArgV0("<pre-initialized>");
  14. Looper.prepareMainLooper();
  15. // Find the value for {@link #PROC_START_SEQ_IDENT} if provided on the command line.
  16. // It will be in the format "seq=114"
  17. long startSeq = 0;
  18. if (args != null) {
  19. for (int i = args.length - 1; i >= 0; --i) {
  20. if (args[i] != null && args[i].startsWith(PROC_START_SEQ_IDENT)) {
  21. startSeq = Long.parseLong(
  22. args[i].substring(PROC_START_SEQ_IDENT.length()));
  23. }
  24. }
  25. }
  26. ActivityThread thread = new ActivityThread();
  27. thread.attach(false, startSeq);
  28. if (sMainThreadHandler == null) {
  29. sMainThreadHandler = thread.getHandler();
  30. }
  31. if (false) {
  32. Looper.myLooper().setMessageLogging(new
  33. LogPrinter(Log.DEBUG, "ActivityThread"));
  34. }
  35. // End of event ActivityThreadMain.
  36. Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
  37. Looper.loop();
  38. throw new RuntimeException("Main thread loop unexpectedly exited");
  39. }

以上为main方法中的全部代码,我们关注以下几点:

  • Looper.prepareMainLooper();
  • Looper.loop();
  • thread.attach(false, startSeq);
  • thread.getHandler();

Looper.prepareMainLooper();

主程序Looper的初始化工作

  1. public static void prepareMainLooper() {
  2. prepare(false);
  3. synchronized (Looper.class) {
  4. if (sMainLooper != null) {
  5. throw new IllegalStateException("The main Looper has already been prepared.");
  6. }
  7. sMainLooper = myLooper();
  8. }
  9. }
  10. private static void prepare(boolean quitAllowed) {
  11. if (sThreadLocal.get() != null) {
  12. throw new RuntimeException("Only one Looper may be created per thread");
  13. }
  14. sThreadLocal.set(new Looper(quitAllowed));
  15. }
  16. public static @Nullable Looper myLooper() {
  17. return sThreadLocal.get();
  18. }

可以看到new Looper的时候传了false

Looper.loop();

1.Looper就是字面意思(轮训器),在loop方法中无限循环的去MessageQueue(消息队列)中读取消息。

  1. MessageQueue则通过next方法无限循环的进行消息出队,无消息时则会进入睡眠

执行thread.attach(false, startSeq);

通过thread.attach(false, startSeq);把ActivityThread 和主线程进行绑定。

执行thread.getHandler();

android之Framework问题总结:的更多相关文章

  1. I.MX6 GPS Android HAL Framework 调试

    I.MX6 GPS Android HAL Framework 调试 一.参考文章: android4. GPS定位问题 http://blog.csdn.net/bzw073/article/det ...

  2. Android application testing with the Android test framework

    目录(?)[-] Android automated testing 1 How to test Android applications Tip 2 Unit tests vs functional ...

  3. Android 添加framework资源包

    为Android系统添加一个新的资源包 概述 传统的Android系统只有一个framework-res.apk资源包,第三方厂商在进行rom定制时会直接修改framework res资源,达到适配目 ...

  4. android 修改framework下资源文件后如何编译

    在framework/base/core/res/res 下添加资源文件后需要先编译资源 然后编译framework 才可正常引用 进入项目根目录 cd frameworks/base/core/re ...

  5. 编译android --system,framework

    在你的android 目录下: sudo git clone  https://android.googlesource.com/platform/manifest cd manifest git b ...

  6. (转)修改Android 的framework层后,重新编译

    1.下面方法适合真机:下载android源码,然后编译你修改的framwork的代码,会生成framework.jar,然后push到system/framework目录下,重启机器!ok 2,下面方 ...

  7. Android UnitTest FrameWork

    Android test suites基于Junit,可以直接使用Junit测试不使用android api的class,也可以使用android的Junit extensions测试android ...

  8. 解决 android push framework.jar 不生效的问题

    . . . . . 在 Android 采用 ART 虚拟机后,为了提高运行时效率,在编译期间会将 jar 包中的 dex 文件编译为 odex.vdex 等文件.而这些文件并不存放在 framewo ...

  9. Android之FrameWork

    1 Activity的生命周期和启动模式 1.1 Activity的生命周期全面分析 用户正常使用情况下的生命周期 & 由于Activity被系统回收或者设备配置改变导致Activity被销毁 ...

  10. Android的Framework分析---5 ActivityManager分析

    Android系统开发交流群:484966421 OSHome. 微信公众号:oshome2015 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font ...

随机推荐

  1. Beyond Compare 4提示已经过了30天试用期

    打开Beyond Compare 4,提示已经超出30天试用期限制,解决方法:1.修改C:\Program Files\Beyond Compare 4\BCUnrar.dll ,这个文件重命名或者直 ...

  2. python文件操作知识点总结:写入篇

    文件写入: 文中的两个变量:f 和 f1(截图时被该死的灯泡遮挡住了) 被称作文件对象 或文件句柄(重口味的叫法,感觉很C++,句子又不是刀子,怎么还带柄?) 以逗号为界,open()方法所依赖的3个 ...

  3. centos 7.3 开放端口并对外开放

    查看已打开的端口 # netstat -anp 查看想开的端口是否已开 # firewall-cmd --query-port=666/tcp 若此提示 FirewallD is not runnin ...

  4. JMeter性能测试工具

    1.官网资源 地址:https://jmeter.apache.org/download_jmeter.cgi window下载zip版本 options配置-选择语言-简体(jmeter.prope ...

  5. jQuery.map(arr|obj,callback)

    jQuery.map(arr|obj,callback) 概述 将一个数组中的元素转换到另一个数组中.广州大理石机械构件 作为参数的转换函数会为每个数组元素调用,而且会给这个转换函数传递一个表示被转换 ...

  6. 五十八.Kibana使用 、 Logstash配置扩展插件

    1.导入数据 批量导入数据并查看    1.1 导入数据   1) 使用POST方式批量导入数据,数据格式为json,url 编码使用data-binary导入含有index配置的json文件 ]# ...

  7. Spring boot请求参数

    GET请求: 1.restful风格: @GetMapping("/order/detail") public BaseOutput omsQueryDetail(@Request ...

  8. ue/um-editor实现word图片复制

    图片的复制无非有两种方法,一种是图片直接上传到服务器,另外一种转换成二进制流的base64码 目前限chrome浏览器使用,但是项目要求需要支持所有的浏览器,包括Windows和macOS系统.没有办 ...

  9. 微信小程序之简单记账本开发记录(二)

    1.打开开发者工具 2.从微信公众平台上获取到appid,或者使用测试号. 项目的大致目录如下: 一个小程序主体部分由三个文件组成,必须放在项目的根目录中 以app为开头的文件名用来布置作用于整个项目 ...

  10. elasticsearch java client

    1.集群名相同,且机器处于同一局域网同一网段,es会自动去发现其他的节点.2.集群不在同一局域网同一网段时,只需要在 elasticsearch.yml 中配置目标机器和端口即可discovery.z ...