4

当我在研究一个开源的 Android 项目时,我有这个问题。

我有一个活动 A1 在其“onCreate”方法中调用另一个活动 A2。但是,“startActivity / startActivityForResult”方法前后都有代码语句。我不知道“startActivity / startActivityForResult”方法之后A1中的执行顺序。

A1的代码框架如下:

public void onCreate(Bundle bundle) {
   <code statements before>
   this.startActivityForResult(.....);  // Start A2 here.
   <code statements after>
}

public void onResume() {
   <code statements>
}

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
   <code statements>
}
.....

我想知道 A1 是否会在调用 A2 之前先完成其执行周期(即“onCreate”->“onStart”->“onResume”->“onPause”->“onStop”),还是先完成“onCreate”再调用调用 A2,还是有其他执行逻辑?

此外,当A2返回(完成)并调用A1中的“onActivityResult”时,A1是否会在执行“onActivityResult”方法后执行“onRestart”->“onStart”->“onResume”?

因为 A1 和 A2 都有自己的 UI,所以我认为这 2 个活动可能不会与两个不同的线程同时执行。有谁知道这种情况下的确切执行顺序?

提前感谢您的任何建议。

4

2 回答 2

12

我使用 2 个非常简单的 Android 活动模拟了这种情况,并得到了以下结果。

以下是当Android在活动A1的方法内执行“startActivity”/“startActivityForResult”以启动另一个活动A2时会发生什么,

  1. 它会认识到现在有触发另一个活动 A2 的意图,
  2. 它将执行到当前方法的末尾(它不会直接跳转到预期的活动 A2),
  3. 然后它会调用当前活动 A1 的“onPause”方法(以允许我们保存当前状态)然后离开当前活动,
  4. 它现在将启动意图活动 A2 并调用其“onCreate”->“onStart”->“onResume”方法序列,
  5. 如果被调用的活动A2已经覆盖了整个屏幕,则可以在此处调用初始调用活动A1的“onStop”方法,
  6. 如果被调用的活动 A2 是“singleTask”活动并且 A1 在堆栈中的 A2 顶部(“singleTask”活动顶部的所有活动都将被销毁,则初始调用活动 A1 的“onDestroy”方法可以在此处调用当“singleTask”活动被带到前面时)。

我把它写在这里希望它可能对其他人有所帮助。

于 2012-05-12T08:40:46.690 回答
2

它们不会在不同的线程上执行,两者都将在主 UI 线程上。您不能保证何时/如果 onResume() 和 onPause() 将被调用,如此处的 Android 生命周期文档中所述

如果您在活动的 onCreate() 中启动另一个活动,您应该期望 A1 UI 未加载(第一次)。当 A2 返回结果时,您应该会看到它。

除此之外,我建议您尝试一下并亲自看看。

于 2012-05-12T03:10:57.150 回答