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

我正在开发Android应用程序一段时间,并遵循了很多有关活动生命周期和应用程序生命周期的文章。

我知道Activity.finish()方法调用Activity.finish()的方式,并从堆栈中删除活动,我想它指向操作系统和垃圾回收器,他可以“做他的诀窍”和自由记忆,当它发现这是一个好时机这样做….

我来到这个职位 – 是否放弃了一个应用程序? 并阅读Mark Murphy的回答。

这让我对finish()方法究竟做了什么感到困惑。

有没有机会我打电话finish()onDestroy()不会被调用?

当在一个activity上调用finish()时,方法onDestroy()被执行,这个方法可以做这样的事情:

  1. closures活动pipe理的任何对话框。
  2. closures活动pipe理的所有游标。
  3. closures任何打开的search对话框

另外, onDestroy()不是析构函数。 它实际上并不摧毁对象。 这只是一个基于某个状态而调用的方法。 因此,在超类的onDestroy()运行并返回后,你的实例仍然活着,非常好。如果用户想重新启动应用程序,Android会保留进程,这使得启动阶段更快。 这个过程不会做任何事情,如果内存需要回收,这个过程将被杀死

我在@K_Anas上的2分钱回答。 我在finish()方法上执行了一个简单的testing。 列出活动生命周期中重要的callback方法

  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() 

onDestroy()意味着最终的清理 – 释放你自己的资源,closures开放的连接,读者,作家等。 如果你不覆盖它,系统会做什么。

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

需要注意的是:

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

Finish()方法将销毁当前活动。 当用户按下后退button时,您不希望再次加载此活动时,可以使用此方法。 基本上它从当前栈中清除活动。

各种答案和笔记声称finish()可以跳过onPause()和onStop()并直接执行onDestroy()。 公平的说,Android的文档( http://developer.android.com/reference/android/app/Activity.html )logging了“活动正在完成或被系统摧毁”,这是相当模糊的,但可能表明finish()可以跳转到onDestroy()。

finish()上的JavaDoc同样令人失望( http://developer.android.com/reference/android/app/Activity.html#finish(); ),实际上并没有注意到响应完成时调用的方法()。

所以我写了这个迷你应用程序下面logging每个国家进入。 它包含一个调用finish()的button – 所以你可以看到哪些方法被触发的日志。 这个实验会提示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"); } } 

另外请注意,如果您在意图之后调用finish(),则无法使用“返回”button返回上一个活动

 startActivity(intent); finish(); 

@ user3282164根据Activity的生命周期,它应该在调用finish()时通过onPause() – > onStop() – > onDestroy() finish()

该图不显示由系统引起的[活动运行]到[ onDestroy() ]的任何直线path。

onStop() doc说:“ 请注意,在内存不足的情况下,这种方法可能永远不会被调用,在这种情况下,系统没有足够的内存来保存活动的进程在其onPause()方法被调用之后运行。

在onCreate()中调用完成时不会像@prakash所说的那样直接调用onDestroy()。 finish()操作将不会开始,直到您将控制权返回给Android。

调用onCreate()中的 finish(): onCreate() – > onStart() – > onResume() 。 如果用户退出应用程序将调用– > onPause() – > onStop() – > onDestroy()

调用onStart()中的 finish(): onCreate() – > onStart() – > onStop() – > onDestroy()

调用onResume()中的 finish(): onCreate() – > onStart() – > onResume() – > onPause() – > onStop() – > onDestroy()

完成后 大约 连续 完成()

我的研究表明, finish()方法实际上将一些销毁操作放入队列中,但是Activity不会立即销毁。 破坏计划虽然。

例如,如果您将finish()放在onActivityResult()callback中,而onResume()尚未运行,那么将首先执行onResume() ,然后才会onStop()onDestroy()

注意: onDestroy()可能根本不会被调用,如文档中所述 。

看来,迄今为止唯一正确的答案是由romnex给出的:“onDestroy()可能根本不会被调用”。 即使在实践中,在几乎所有情况下,它都不能保证:finish()上的文档只承诺将活动的结果传播callback用者,但仅此而已。 而且, 生命周期文档清楚地表明,只要onStop()完成(甚至在较早的设备上更早),操作系统就可以支持该活动,即使在简单的testing中不太可能并因此难以观察,也可能意味着活动在执行onDestroy()之前甚至可能会被杀死。

所以,如果你想在调用finish()时确定一些工作已经完成,你不能把它放在onDestroy()中,但是在调用finish()之前,需要在你调用finish()的地方进行。

完成()只是发回到以前的活动在android中,或者你可以说,它是在应用程序中退一步