新活动是否在新线程中运行?

时间:2012-04-25 02:00:05

标签: android

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

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");

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

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

它在同一个线程中运行(与应用中的所有活动一样),但是在startActivity调用中未创建活动。在幕后,框架为您的所有活动提供了一个循环,其中包含待处理操作的消息队列。消息队列接收有关用户输入和状态更改的消息,并且每次循环时,它处理队列中的下一个输入,可能调用ActivityView回调之一(例如{{} 1}})。

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

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