我有一段简单的代码可以启动一个意图,但是当我调试它时会通过各种类,并且经常让我想知道为什么每次调用这些类以及它们在恢复正常执行之前执行了哪些任务。
然后转到处理程序类并调用dispatchMessage(Message msg)
最后,在回到正常流程之前,它会多次调用 Looper 类的loop()
。
所以有人可以帮助我在这里了解幕后发生了什么以及为什么这个循环()被多次调用?
答案 0 :(得分:2)
deinit
是loop()
课程的一部分。当您的进程初始化应用程序时,您的Android应用程序深入,JVM首先寻找的是一个入口点,在所有Java应用程序中都是主要方法。 android main方法存在于一个名为Looper
的类中(检查活动线程的AOSP)。
这堂课的美妙之处在于它做了一些事情,
ActivityThread
主要方法中的Looper调用ActivityThread
方法。这个。将当前线程初始化为应用程序的主要循环程序。即这是您的主线程接收其 mainthread 标识的位置,它与运行时的所有其他线程不同。 使得android与大多数桌面/控制台(如java应用程序)不同的是Looper类。这个类有prepareMainLooper()
方法在Looper.loop()
的main方法中调用,并且由于ActivityThread
而运行无限循环(双分号表示无限循环) 。除非从外部调用for(;;){}
,否则此循环将继续无限期运行。循环方法每次完成消息时调用quit()
,以检索新消息。
简而言之,如果没有这种无限循环方法,android很难有一种基本的方式来异步处理传入的消息,这是Android事件驱动性质的核心。循环热切地寻求新消息来处理或传递给处理程序。
如果您有兴趣,请查看AOSP以获得更深入的潜水!