0

当我创建一个新活动时,新活动是否在新线程中运行?

Log.d("testing", "before activity start");

intent = new Intent(CurrentActivity.this, SecondActivity.class); //I put "Log.d("testing","in secondActivity")" in SecondActivity.onCreate()
startActivity(intent);

Log.d("testing", "after activity start");

我认为执行的顺序将是“活动开始前”->“在 secondActivity”->“活动开始后”

但事实上,并非如此。有人知道原因吗?那么,新活动是否在新线程中运行?

4

2 回答 2

2

不,它不是在新线程中运行。它正在 UI 线程中运行。“默认情况下,单个进程中的所有应用程序代码都在主 UI 线程中运行。这也是处理 UI 事件的同一线程。唯一的例外是处理来自其他进程的 IPC 调用的代码。系统维护每个进程中有一个单独的事务线程池来调度所有传入的 IPC 调用。开发人员应该为任何长时间运行的代码创建单独的线程,以避免阻塞主 UI 线程。http://developer.android.com/resources/faq/framework.html

于 2012-04-25T02:15:27.657 回答
0

它在同一个线程中运行(就像您的应用程序中的所有活动一样),但创建活动不是在startActivity调用内部完成的。在幕后,该框架为您的所有活动提供了一个循环,其中包含一个待处理操作的消息队列。消息队列接收有关用户输入和状态更改的消息,并且每次循环时,它都会处理来自队列的下一个输入,可能会调用其中一个ActivityView回调(例如onTouchEvent)。

当您调用 时startActivity,它会将该请求排入主线程的消息队列中。在您的函数返回后,循环稍后将从队列中获取该请求,创建活动,并调用onCreate和所有其他生命周期回调。这就是为什么onCreate在你的函数返回之后才看到被调用的原因。

顺便说一句,这就是为什么您还需要注意,您的回调不会花费太长时间来执行或阻塞:只有在它们返回之后,线程的循环才能处理来自队列的其他请求,例如用户输入。

于 2012-11-15T15:44:37.323 回答