方法到底在做什么?

我开发了一段时间的 android 应用程序,关注了很多关于活动生命周期和应用程序生命周期的帖子。

我知道 Activity.finish()方法在某个地方调用了 Activity.onDestroy(),并且从堆栈中删除了活动,我猜它以某种方式指向操作系统和垃圾收集器,他可以“完成他的任务”,并且在适当的时候释放内存... ..。

我来到这个岗位 退出申请是不是不受欢迎? 读读马克 · 墨菲的回答。

这让我对 finish()方法实际上做了什么感到有点困惑。

有没有可能我打电话给 finish()onDestroy()不会被打?

262197 次浏览

onDestroy()用于最终清理——释放您自己可以使用的资源,关闭打开的连接、读取器、编写器等。如果你不覆盖它,系统就会做它该做的事。

另一方面,finish()只是让系统知道程序员希望完成当前的 Activity。因此,它在此之后调用 onDestroy()

值得注意的是:

没有必要 只有finish()的调用触发对 onDestroy()的调用。没有。正如我们所知,如果 Android 系统觉得需要释放当前 Activity所需的资源,那么它可以自由地终止活动。

当对某个活动调用 finish()时,将执行方法 onDestroy():

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

而且 onDestroy()不是析构函数。它实际上并没有摧毁物体。它只是一个基于特定状态调用的方法。因此,在超类的 onDestroy()运行并返回之后,您的实例仍然是活动的并且非常好 * 。Android 在用户需要重新启动应用程序时会保留一些进程,这使得启动阶段更快。进程不会执行任何操作,如果需要回收内存,进程将被终止

方法将销毁当前活动。 当用户按下后退按钮时,您可以在不希望反复加载此活动的情况下使用此方法。 基本上,它从.current 堆栈中清除活动。

Finish ()只是发送回 android 中的前一个活动,或者可以说它在应用程序中回退了一步

@ user3282164根据 活动的生命周期,在调用 finish()时应该经过 onPause()-> onStop()-> onDestroy()

该图没有显示由系统引起的从[ Activity Running ]到[ onDestroy()]的任何直线路径。

OnStop () doc 说 “ 请注意,在内存不足的情况下,如果系统没有足够的内存来保持活动的进程在调用 onPuse ()方法之后继续运行,那么这个方法可能会 < strong > never 被调用。

各种答案和说明都声称 Finish ()可以跳过 onPuse ()和 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 ()的按钮——这样您就可以看到哪些方法被激发的日志。这个实验建议 Finish () 的确如此也调用 Puse ()和 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");
}


}

我对@K _ Anas 的回答有2分意见。 我对 Finish ()方法执行了一个简单的测试。 列出了活动生命周期中的重要回调方法

  1. 在 onCreate ()中调用 Finish () : OnCreate ()-> onDestroy ()
  2. 在 onStart ()中调用 Finish () : OnCreate ()-> onStart ()-> onStop ()-> onDestroy ()
  3. OnResume ()中的调用 Finish () : OnCreate ()-> onStart ()-> onResume ()-> onPuse ()-> onStop ()-> onDestroy ()

我想说的是,当 Finish ()被执行时,方法的对应物以及中间的任何方法都会被调用。

例如:

 onCreate() counter part is onDestroy()
onStart() counter part is onStop()
onPause() counter part is onResume()

我的研究表明,finish()方法实际上在队列中放置了一些销毁操作,但是活动并没有立即被销毁。不过破坏已经安排好了。

例如,如果在 onActivityResult()回调中放置 finish(),而 onResume()尚未运行,那么将执行第一个 onResume(),并且仅在调用 onStop()onDestroy()之后执行。

注意: onDestroy()可能根本不会被调用,正如在 文件中所说明的那样。

似乎到目前为止,这里唯一正确的答案是由罗梅克斯给出的: “ onDestroy ()可能根本不会被调用”。即使在实践中,几乎在所有情况下都会发生这种情况,也不能保证: Finish ()上的 文件只是承诺将活动的结果传播回调用者,仅此而已。此外,生命周期文档澄清了一旦 onStop ()完成(甚至更早在旧设备上完成) ,该活动就可以被操作系统杀死,尽管这种情况不太可能发生,因此在简单测试中很难观察到,但这可能意味着该活动可能在 onDestroy ()执行时甚至在执行之前被杀死。

因此,如果您想确保在调用 Finish ()时完成某些工作,则不能将其放入 onDestroy ()中,而是需要在实际调用它之前在调用 Finish ()的同一位置执行。

在 onCreate ()中调用 Finish 将不会像@prakash 说的那样直接调用 onDestroy ()。在你把控制权还给 Android 之前,finish()操作甚至都不会开始。

OnCreate ()中调用 Finish () : OnCreate ()-> onStart ()-> onResume ()。如果用户退出应用程序将调用 - > onPuse ()-> onStop ()-> onDestroy ()

OnStart ()中调用 Finish () : OnCreate ()-> onStart ()-> onStop ()-> onDestroy ()

OnResume ()中调用 Finish () : OnCreate ()-> onStart ()-> onResume ()-> onPuse ()-> onStop ()-> onDestroy ()

为了进一步的参考检查看看这个 完成后连续生成差不多完成了

还要注意,如果在一个意图之后调用 Finish () ,就不能使用“ back”按钮返回到之前的活动

startActivity(intent);
finish();

除了上面@rommex 的回答之外,我还注意到 finish()确实对活动的销毁进行了排队,这取决于活动的优先级。

如果我在 onPause()之后调用 finish(),我会看到 onStop(),并立即调用 onDestroy()

如果我在 onStop()之后调用 finish(),我直到5分钟之后才看到 onDestroy()

从我的观察,它看起来像完成排队,当我看到的 adb shell dumpsys activity activities它被设置为 finishing=true,但由于它不再是在前台,它没有优先销毁。

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

Roomex 说的没错!

发生在我身上的事情是,我正在开发一个应用程序,它要求我使用蓝牙侦听器类。主页中的一个片段调用了一个同样使用 BluetoothListner 类的活动。我使用 StartActivityForResult ()方法来获得确认。问题在于,当尝试侦听蓝牙端口时,活动通道仍然处于活动状态,并且得到了片段的确认。即使我特别关闭它 OnDestroy ()方法。我花了好几天,却停不下来。

我认为如果我不使用 StartAcvityForResult (),而只是使用 StartActivity (),不管有没有调用 完成()方法,都有可能解决这个问题。当然,如果我在片段内部调用 完成(),那么从活动将不得不使用导航视图回忆 MainActivity 并指向片段。通过这种方式,它可能会创建 MainActivity 的一个全新实例。或者在调用 Activity 时不使用 完成(),则 OnDestroy ()方法将为该活动调用,一旦返回到该活动,将调用片段的 OnResume ()方法。