首页 文章

为什么在活动之间移动时总会执行oncreate?

提问于
浏览
3

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

我有两个活动,我跟踪所有生命周期回调方法 . 如果我从activity1转到activity2,返回到activity1,依此类推,在按钮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>

当我使用操作栏上的选项返回活动按钮时,oncreate对于activity1是有效的 .

这是我在日志中获得的

应用程序启动时:

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

从操作栏返回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仅在应用程序启动时或系统de dested应用程序时调用,但我没有看到ondestroy调用 .

谢谢

1 回答

  • 1

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

    另外,正如我在评论中指出的那样,当您使用操作栏中的按钮从activity2返回到activity1时,您正在使用"up navigation" . 有关如何处理此问题的特殊规则:请参阅http://developer.android.com/training/implementing-navigation/ancestral.html#NavigateUp

相关问题