没有onpause()或onstop()被调用的情况下,Android场景会调用ondestroy()方法。

27
最近我被要求写下一些场景,其中ondestroy()方法被调用时没有调用onpause()或onstop()方法。这种情况是否可能发生?如果是,请解释一下。
5个回答

33

如果您尝试以下代码,您会发现一种情况,onDestroy()确实被调用,而onPause()onStop()生命周期回调被跳过。

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        finish();
    }

    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        Log.e("MainActivity", "onDestroy");
    }

    @Override
    protected void onPause() {
        // TODO Auto-generated method stub
        super.onPause();
        Log.e("MainActivity", "onPause");

    }

    @Override
    protected void onStop() {
        // TODO Auto-generated method stub
        super.onStop();
        Log.e("MainActivity", "onStop");

    }
换言之,如果在onCreate()中创建Activity时调用finish(),系统将直接调用onDestroy()

1
还有一种情况是在onStop()之前,会先调用onPause(),并且在一个未停止的工作线程中调用finish(),这将跳过onPause()并调用onDestroy()。 - Buddy

7
如果在onCreate()方法中调用finish(),则不会调用onPause()和onStop()。例如,在onCreate()期间检测到错误并调用finish()。但是,在这种情况下,您预期在onPause()和onStop()中完成的任何清理都将不会执行。
虽然onDestroy() 是活动生命周期中的最后一个回调,但值得一提的是,不能始终依靠此回调来销毁资源,因为系统有时会仅仅杀死活动所在的进程,而没有在其中调用此方法(或任何其他方法)。因此,不应将其用于执行希望在进程消失后仍然存在的任务。更好的做法是在onStart()和onResume()中创建资源,并在onStop()和onPause()中销毁它们。
参考 - https://www.toptal.com/android/interview-questions

3
当我们调用finish方法关闭一个Activity时,就会发生这种情况。
例如,在你的Activity中调用this.finish();

1

当我们在一个活动中直接调用finish()时,这是可能的。 当在一个活动中调用finish()时,onDestroy()会被执行,并执行以下操作:

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

0

当Activity B从Activity A调用时 然后 . A onCreate . A onStart . A onResume . A onPause . B onCreate . B onStart . B onResume . A onStop 2. 返回按钮按下 . OnCreate . OnStart . OnResume . OnPause . OnStop . OnDestroy 3. 在电话呼叫时 . onCreate . OnStart . OnResume . OnPause . OnStop

4.在onCreate中调用finish会发生什么? -> 创建后立即调用OnDestroy

  1. 给出一个只调用onPause而不调用onStop的例子? -> 任何对话框或广告出现在活动屏幕上

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接