Android - call" finish()"不会触发onDestroy

时间:2016-03-13 16:28:53

标签: java android android-intent android-lifecycle

我有3项活动。我想做这样的事情:

A - >按下按钮 - > B - >按下按钮 - > (销毁A,B)创建C

一切正常,但我注意到了一些"奇怪的" Android Studio日志中的行为。

当我按下活动A上的按钮时,这样就完成了:

I/System.out: The A Activity is onStart. 
I/System.out: The A Activity is onResume. 
I/System.out: The A Activity is onPause. 
I/System.out: The B Activity is onResume. 
I/System.out: The A Activity is stopped.

然后我再次按下活动B上的按钮:

I/System.out: The B Activity is paused.
I/System.out: The B Activity is stopped.

然后我进入活动C.但是在控制台上没有写出活动A和B被销毁,即使我在活动B中调用方法finish()。

只是,当从活动C开始我按下后退按钮时会执行此操作。

I/System.out: The B Activity is destroyed.
I/System.out: The A Activity is destroyed.

我会自动退出该应用。

我的问题是: 当我按下活动B上的按钮时,为什么没有触发这个?

B班:

startActivity(new Intent(this, C.class));

B停止:

@Override
protected void onStop() {

    Intent returnIntent = getIntent();
    setResult(Activity.RESULT_CANCELED, returnIntent);
    finish();

    super.onStop();

    System.out.println("The B Activity is stopped.");
}

一堂课:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if(requestCode == 1){
        finish();
    }
}

修改

另一个奇怪的事情是,当我按下活动B中的按钮时,我进入活动C,然后执行活动B onStop。

可是:

  1. 正如我所说的完成()不会触发
  2. setResult()不会触发活动A" onActivityResult"
  3. 什么时候触发了setResult()?和onDestroy()?

    一起

    编辑2

    如果您阅读了评论,则会出现另一个有趣的问题。

    为什么从onStop()调用finish()时不会调用onDetroy()方法?当finish()方法超出onStop()时,通常会调用onDestroy()。

    这是正常/按设计?

2 个答案:

答案 0 :(得分:1)

  1. 活动在堆栈上,所以当你从一个活动开始一个新活动时,旧活动不会被破坏,它会被保留在堆栈中,因为通常你会在应用程序的生命周期中回到它,通过按下"后退按钮"。

  2. 如果需要触发活动的结果,则必须调用startActivityForResult

  3. onDestroy是在不再需要活动时触发的,这是android框架的决定而你真的不知道,当发生这种情况时,因为android猜测它很有可能你会回到它应用生命周期。它取决于使用的内存和导航到它的距离,只是优化构建活动以避免滞后行为。

答案 1 :(得分:1)

关于你的"编辑2",当你离开屏幕直到它变黑,或者当你只是按下关闭按钮关闭屏幕时,onDestroy()实际上会被调用。

正如@Henning Luther所提到的,答案可能在Android的某个深处,也可能与表面和其他东西一起做......

如果我将完成()放在onStop()之外,它会被正常破坏。

*这不是一个完整的答案,但由于我不能发表评论,我这样做了,因为我想分享它