【问题标题】:Why is oncreate executed always when moving between activities?为什么在活动之间移动时总是执行 oncreate?
【发布时间】:2014-10-21 14:14:08
【问题描述】:

我对活动生命周期有疑问。

我有两个活动来跟踪所有生命周期回调方法。 如果我从活动 1 转到活动 2,返回活动 1 等等,在按钮 onclick 上使用 startActivity(intent),我看到两个活动始终执行 oncreate,但没有执行 ondestroy。

我从一个活动更改为另一个活动:

button.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        Intent intent = new Intent(getActivity(), Activity2.class);
        startActivity(intent);
    }
});

这是我在日志中得到的

应用启动时:

09-23 23:01:03.863    2485-2485/com.qqapps.androidactivitylifecycle I/Test? Activity1 onCreate
09-23 23:01:03.951    2485-2485/com.qqapps.androidactivitylifecycle I/Test? Activity1 onStart
09-23 23:01:03.953    2485-2485/com.qqapps.androidactivitylifecycle I/Test? Activity1 onPostCreate
09-23 23:01:03.953    2485-2485/com.qqapps.androidactivitylifecycle I/Test? Activity1 onResume
09-23 23:01:03.960    2485-2485/com.qqapps.androidactivitylifecycle I/Test? Activity1 onPostResume

当点击按钮进入activity2时:

09-23 23:01:46.722    2485-2485/com.qqapps.androidactivitylifecycle I/Test? Activity1 onPause
09-23 23:01:46.758    2485-2485/com.qqapps.androidactivitylifecycle I/Test? Activity2 onCreate
09-23 23:01:46.848    2485-2485/com.qqapps.androidactivitylifecycle I/Test? Activity2 onStart
09-23 23:01:46.854    2485-2485/com.qqapps.androidactivitylifecycle I/Test? Activity2 onPostCreate
09-23 23:01:46.855    2485-2485/com.qqapps.androidactivitylifecycle I/Test? Activity2 onResume
09-23 23:01:46.855    2485-2485/com.qqapps.androidactivitylifecycle I/Test? Activity2 onPostResume
09-23 23:01:47.114    2485-2485/com.qqapps.androidactivitylifecycle I/Test? Activity1 onSaveInstanceState
09-23 23:01:47.155    2485-2485/com.qqapps.androidactivitylifecycle I/Test? Activity1 onStop

当点击按钮进入activity1时:

09-23 23:02:08.156    2485-2485/com.qqapps.androidactivitylifecycle I/Test? Activity2 onPause
09-23 23:02:08.372    2485-2485/com.qqapps.androidactivitylifecycle I/Test? Activity1 onCreate
09-23 23:02:08.683    2485-2485/com.qqapps.androidactivitylifecycle I/Test? Activity1 onStart
09-23 23:02:08.683    2485-2485/com.qqapps.androidactivitylifecycle I/Test? Activity1 onPostCreate
09-23 23:02:08.683    2485-2485/com.qqapps.androidactivitylifecycle I/Test? Activity1 onResume
09-23 23:02:08.684    2485-2485/com.qqapps.androidactivitylifecycle I/Test? Activity1 onPostResume
09-23 23:02:09.078    2485-2485/com.qqapps.androidactivitylifecycle I/Test? Activity2 onSaveInstanceState
09-23 23:02:09.088    2485-2485/com.qqapps.androidactivitylifecycle I/Test? Activity2 onStop

你可以看到我返回的时候Activity1 onCreate被执行了。

当我在 AndroidManifest.xml 中将 activity1 定义为 activity2 的父级时,也会发生同样的事情

<activity
    android:name=".Activity1"
    android:label="@string/app_name" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
<activity
    android:name=".Activity2"
    android:label="@string/title_activity_activity2"
    android:parentActivityName=".Activity1" >
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value="com.qqapps.androidactivityparent.Activity1" />
</activity>

当我使用操作栏上的选项返回到活动按钮时,会为活动 1 执行 oncreate。

这是我在日志中得到的

应用启动时:

09-25 15:36:17.269    5208-5208/com.qqapps.androidactivityparent I/Test? Activity1 onCreate
09-25 15:36:17.469    5208-5208/com.qqapps.androidactivityparent I/Test? Activity1 onStart
09-25 15:36:17.469    5208-5208/com.qqapps.androidactivityparent I/Test? Activity1 onPostCreate
09-25 15:36:17.470    5208-5208/com.qqapps.androidactivityparent I/Test? Activity1 onResume
09-25 15:36:17.470    5208-5208/com.qqapps.androidactivityparent I/Test? Activity1 onPostResume

当点击按钮进入activity2时:

09-25 15:36:49.210    5208-5208/com.qqapps.androidactivityparent I/Test? Activity1 onPause
09-25 15:36:49.224    5208-5208/com.qqapps.androidactivityparent I/Test? Activity2 onCreate
09-25 15:36:49.253    5208-5208/com.qqapps.androidactivityparent I/Test? Activity2 onStart
09-25 15:36:49.253    5208-5208/com.qqapps.androidactivityparent I/Test? Activity2 onPostCreate
09-25 15:36:49.254    5208-5208/com.qqapps.androidactivityparent I/Test? Activity2 onResume
09-25 15:36:49.255    5208-5208/com.qqapps.androidactivityparent I/Test? Activity2 onPostResume
09-25 15:36:49.528    5208-5208/com.qqapps.androidactivityparent I/Test? Activity1 onSaveInstanceState
09-25 15:36:49.566    5208-5208/com.qqapps.androidactivityparent I/Test? Activity1 onStop

从action bar返回activity1时:

09-25 15:37:17.741    5208-5208/com.qqapps.androidactivityparent I/Test? Activity2 onPause
09-25 15:37:17.754    5208-5208/com.qqapps.androidactivityparent I/Test? Activity1 onDestroy
09-25 15:37:17.765    5208-5208/com.qqapps.androidactivityparent I/Test? Activity1 onCreate
09-25 15:37:17.790    5208-5208/com.qqapps.androidactivityparent I/Test? Activity1 onStart
09-25 15:37:17.790    5208-5208/com.qqapps.androidactivityparent I/Test? Activity1 onPostCreate
09-25 15:37:17.791    5208-5208/com.qqapps.androidactivityparent I/Test? Activity1 onResume
09-25 15:37:17.792    5208-5208/com.qqapps.androidactivityparent I/Test? Activity1 onPostResume
09-25 15:37:17.957    5208-5208/com.qqapps.androidactivityparent I/Test? Activity2 onStop
09-25 15:37:17.958    5208-5208/com.qqapps.androidactivityparent I/Test? Activity2 onDestroy

在这种情况下,我看到在单击操作栏选项时,两个活动都调用了 onDestroy。我认为这是多余的。

正如我在这里看到的 http://developer.android.com/training/basics/activity-lifecycle/index.html 我认为 oncreate only 仅在应用程序启动或系统破坏应用程序时调用,但我没有看到 ondestroy 调用。

谢谢

【问题讨论】:

  • onCreate 每次创建活动时都会调用,方法 startActivity(intent,class) 创建新活动,您的按钮正在创建新活动,永远不会返回,如果您想从活动2返回活动一,只需点击设备上的返回按钮
  • @user2478830 进一步详细说明 Marcel(他是正确的),onDestroy() 由系统调用,您通常无法控制它,因此它不能用作可靠的通话。如果您想要 Activity 的单个实例,您可以在这些 Activity 上设置标志以获得这种性质。
  • 我同意@MarcelKrivek,使用一个活动作为你的“MAIN”,第二个作为你的次要活动,总是从主要启动次要,然后回到主要,关闭次要。如果两者都需要保持打开状态,请在您的意图中使用 FLAG_ACTIVITY_REORDER_TO_FRONT 标志。 stackoverflow.com/questions/2232238/…
  • 如果您按下设备上的返回按钮会发生什么,它会恢复不从头开始?但是当您意图触发它时,它会重新创建其他活动,这就是 onCreate 调用的原因
  • 当您使用操作栏中的按钮从activity2返回到activity1时,您正在使用“向上导航”。如何处理有特殊规则:见developer.android.com/training/implementing-navigation/…

标签: android android-activity lifecycle


【解决方案1】:

如果您使用按钮从活动 1 到活动 2 以及从活动 2 到活动 1,您将继续创建新活动,并且只是在应用程序的活动堆栈中创建一大堆。然后,您将看到每次切换时都会调用onCreate(),并且您将永远不会看到调用onDestroy(),因为您的任何活动都没有被破坏。它们都在您任务的活动堆栈中。如果你使用命令行工具adb shell dumpsys activity activities,你甚至可以看到它们。

另外,正如我在评论中指出的那样,当您使用操作栏中的按钮从活动 2 返回到活动 1 时,您正在使用“向上导航”。如何处理有特殊规则:见http://developer.android.com/training/implementing-navigation/ancestral.html#NavigateUp

【讨论】:

    猜你喜欢
    • 2018-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-23
    相关资源
    最近更新 更多