Activity.finish()方法到底在做什么?

Tal*_*nel 148 android application-lifecycle activity-lifecycle ondestroy

我正在开发Android应用程序一段时间,并且关注了很多关于活动生命周期和应用程序生命周期的帖子.

我知道Activity.finish()方法调用的方法Activity.onDestroy(),并从堆栈中删除活动,我想它以某种方式指向操作系统和垃圾收集器,他可以"做他的把戏"并释放内存,当它发现它是一个很好的时间做所以....

我来到这篇文章 - 退出申请不赞成?并阅读Mark Murphy的回答.

这让我对这个finish()方法究竟是做什么感到困惑.

我有机会打电话finish(),onDestroy()不会打电话吗?

K_A*_*nas 163

在调用finish()一个activity时,该方法onDestroy()执行此方法可以执行以下操作:

  1. 关闭活动正在管理的任何对话框.
  2. 关闭活动管理的所有游标.
  3. 关闭所有打开的搜索对话框

此外,onDestroy()不是析构函数.它实际上并没有破坏对象.它只是一种基于某种状态调用的方法.因此,在超类onDestroy()运行并返回之后,您的实例仍然存活且非常好.Android会保留进程,以防用户想要重新启动应用程序,这会使启动阶段更快.该过程将不会执行任何操作,如果需要回收内存,则该过程将被终止

  • 我再次测试,发现onPause(),onStop()和onDestroy()将在调用finish()后按顺序调用. (34认同)
  • 是的,如果你回到Activity onCreate()将被调用. (9认同)
  • finish()还调用onPause()和onStop()吗? (8认同)
  • 所以finish()方法只触发对onDestroy()的调用,那就是它? (4认同)
  • @Laurent onPause()和onStop()并不总是被调用.在下面的答案中看到我的观察 (4认同)

Pra*_*ash 71

@K_Anas的2美分答案.我对finish()方法进行了一个简单的测试.列出了活动生命周期中的重要回调方法

  1. 在onCreate()中调用finish():onCreate() - > onDestroy()
  2. 在onStart()中调用finish():onCreate() - > onStart() - > onStop() - > onDestroy()
  3. 在onResume()中调用finish():onCreate() - > onStart() - > onResume() - > onPause() - > onStop() - > onDestroy()

我的意思是说,当执行finish()时,会调用方法的对应部分以及其间的任何方法.

例如:

 onCreate() counter part is onDestroy()
 onStart() counter part is onStop()
 onPause() counter part is onResume()
Run Code Online (Sandbox Code Playgroud)


Dan*_*ada 25

另请注意,如果您在意图后调用finish(),则无法使用"后退"按钮返回上一个活动

startActivity(intent);
finish();
Run Code Online (Sandbox Code Playgroud)


Kaz*_*ara 12

onDestroy()用于最终清理 - 释放您可以自己的资源,关闭开放的连接,读者,作家等.如果不覆盖它,系统会执行它所拥有的操作.

另一方面,finish()让系统知道程序员想要Activity完成当前的电流.因此,它onDestroy()在此之后召集起来.

需要注意的事项:

没有必要只有一个调用来finish()触发调用onDestroy().不,如我们所知,如果感觉Activity需要释放当前需要的资源,android系统可以自由地杀死活动.

  • 注意:如果系统终止进程,则可能不会调用onDestroy.http://developer.android.com/reference/android/app/Activity.html#onDestroy%28%29 (3认同)

Udi*_*ahi 9

Finish()方法将破坏当前活动.如果您不想在用户按下后退按钮时反复加载此活动,则可以使用此方法.基本上它会清除当前堆栈中的活动.


Cod*_*ght 5

各种答案和注释都声称finish()可以跳过onPause()和onStop()并直接执行onDestroy()。公平地讲,有关此内容的Android文档(http://developer.android.com/reference/android/app/Activity.html)指出“活动正在完成或被系统破坏”,但模棱两可,但可能表明finish()可以跳转到onDestroy()。

同样,finish()上的JavaDoc令人失望(http://developer.android.com/reference/android/app/Activity.html#finish()),并且实际上并未注意到为完成而调用了哪些方法()。

所以我写了这个迷你应用程序,在下面记录了每个状态。它包含一个调用finish()的按钮-因此您可以查看触发了哪些方法的日志。该实验表明,finish()实际上确实也调用了onPause()和onStop()。这是我得到的输出:

2170-2170/? D/LIFECYCLE_DEMO? INSIDE: onCreate
2170-2170/? D/LIFECYCLE_DEMO? INSIDE: onStart
2170-2170/? D/LIFECYCLE_DEMO? INSIDE: onResume
2170-2170/? D/LIFECYCLE_DEMO? User just clicked button to initiate finish() 
2170-2170/? D/LIFECYCLE_DEMO? INSIDE: onPause
2170-2170/? D/LIFECYCLE_DEMO? INSIDE: onStop 
2170-2170/? D/LIFECYCLE_DEMO? INSIDE: onDestroy

package com.mvvg.apps.lifecycle;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.Toast;

public class AndroidLifecycle extends Activity {

    private static final String TAG = "LIFECYCLE_DEMO";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "INSIDE: onCreate");
        setContentView(R.layout.activity_main);
        LinearLayout layout = (LinearLayout) findViewById(R.id.myId);
        Button button = new Button(this);
        button.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View view) {
                Toast.makeText(AndroidLifecycle.this, "Initiating finish()",
                        Toast.LENGTH_SHORT).show();
                Log.d(TAG, "User just clicked button to initiate finish()");
                finish();
            }

        });

        layout.addView(button);
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG, "INSIDE: onStart");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG, "INSIDE: onStop");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "INSIDE: onDestroy");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d(TAG, "INSIDE: onPause");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG, "INSIDE: onResume");
    }

}
Run Code Online (Sandbox Code Playgroud)


Bra*_*Lim 5

除了上面的@rommex答案之外,我还注意到finish()确实确实将Activity的销毁排入队列,并且它取决于Activity的优先级。

如果finish()在之后致电onPause(),我会看到onStop()onDestroy()立即致电。

如果我finish()在之后致电onStop()onDestroy()则要等5分钟后才能看到。

从我的观察来看,完成似乎在排队,当我将adb shell dumpsys activity activities其设置为时finishing=true,但是由于它不再位于前台,因此没有优先考虑进行销毁。

总之,onDestroy()永远不能保证会被调用,但是即使在被调用的情况下,也可能会延迟。