首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >调用"finish()“不触发onDestroy

调用"finish()“不触发onDestroy
EN

Stack Overflow用户
提问于 2016-03-13 16:28:52
回答 3查看 4.3K关注 0票数 2

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

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

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

当我按下活动A的按钮时,这个操作就完成了:

代码语言:javascript
运行
复制
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的按钮:

代码语言:javascript
运行
复制
I/System.out: The B Activity is paused.
I/System.out: The B Activity is stopped.

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

只是,当我在活动C中按后退按钮时,就会执行这个操作。

代码语言:javascript
运行
复制
I/System.out: The B Activity is destroyed.
I/System.out: The A Activity is destroyed.

我会自动退出应用程序。

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

B级:

代码语言:javascript
运行
复制
startActivity(new Intent(this, C.class));

B中途停车:

代码语言:javascript
运行
复制
@Override
protected void onStop() {

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

    super.onStop();

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

一堂课:

代码语言:javascript
运行
复制
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

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

编辑:

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

但是:

  1. 正如我所说的,finish()不会触发
  2. setResult()不触发活动A "onActivityResult“

何时触发setResult()?与onDestroy()一起?

编辑2

如果你读到这些评论,就会发现另一个有趣的问题。

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

这是正常的[按设计的]吗?

EN

回答 3

Stack Overflow用户

发布于 2016-03-13 21:43:28

  1. 活动在堆栈上,所以当你从一个堆栈开始一个新的活动时,旧的不会被破坏,它会被保存在堆栈上,因为通常你会在你的应用程序的生命周期中通过“后退按钮”回到它。
  2. 当您想要一个触发活动的结果时,必须调用startActivityForResult
  3. 当活动不再需要时,onDestroy就会被触发--这是安卓框架的一个决定,你不知道什么时候会发生这种情况,因为安卓猜这是你在应用程序生命周期中回到它的好机会。它取决于使用的内存和导航到它的距离,这只是对构造活动的优化,以避免延迟行为。
票数 1
EN

Stack Overflow用户

发布于 2016-03-14 00:37:41

关于您的“编辑2",当您离开屏幕直到屏幕变黑,或者您只需按”关闭按钮“关闭屏幕时,onDestroy()实际上就会被调用。

正如@Henning Luther所提到的,答案可能是在Android的某个地方,并且可能也与表面和其他事物有关。

如果我将finish()从onStop()中删除,它通常会被销毁。

*这不是一个完整的回答,但由于我不能发表评论,我就这样做了,所以想分享一下

票数 1
EN

Stack Overflow用户

发布于 2022-12-02 18:15:56

我还遇到了一些问题,我发现在调用活动onDestroy的finish之后,还在未调用的地方调用了侦听器ActivityLifecycleCallbacks.onActivityDestroyed。如何--当我签出文档时,它们看起来应该在哪里:

Activity.onDestory文档显示:

在活动被销毁之前执行任何最后的清理。这可能是因为活动正在完成(有人在其上调用finish() ),或者因为系统正在临时销毁该活动的这个实例,以节省空间。您可以使用isFinishing()方法区分这两种场景..。

但我发现isFinishing也不是真的。

我的解决方案是简单地使用依赖活动onDestroy的代码等待,使用运行在主线程上的:Handler.postDelayed来调用这些代码,还可以使用执行相同操作的视图post(Runnable action)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35972726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档