为什么会调用onDestroy()方法?

5

我的应用有3个类。第一个类是闪屏,第二个类包含播放列表,第三个类包含该播放列表的内容。当选择一个播放列表时,第三个类开始显示播放列表内容。在第二个类中我有:

@Override
    protected void onStop() {
        super.onStop();
        System.out.println("onStop Playlist!!!!");
    }

    protected void onDestroy() {
        super.onDestroy();
        System.out.println("onDestroy Playlist");
    }

当第三类准备好启动时,我在DDMS上收到以下消息:“onStop Playlist!”“onDestroy Playlist”。 为什么会调用这些方法?难道不应该只调用onPause方法吗?问题是当应用程序结束时,我想停止某个计时器,但我不知道在这种情况下我可以在哪里停止计时器。您有什么想法吗?

我像这样调用第三类:

Intent i = new Intent(getBaseContext(), ViewPlaylist.class);
i.putExtra("id", idPlaylist[position]);
i.putExtra("timer", timerPlaylist[position]);
startActivity(i);
finish();

问题是我调用了finish()函数?

这取决于您如何调用第三个类(启动第三个活动)。如果您显示一些代码,我们可以帮助您。 - user370305
3个回答

5
如果你阅读 Activity 类的文档(关于 onDestroy() 方法),你会发现:
在你的活动销毁之前,你会接收到最后一个调用。这可能是因为活动正在结束(有人在它上面调用了 finish())或者因为系统暂时销毁了这个活动实例以节省空间。你可以使用 isFinishing() 方法来区分这两种情况。

1

这是因为您使用了finish()来结束第二个活动。所以,您可以使用startActivityForResult()并在第二个活动中覆盖onActivityResult()方法。这样,在这种情况下,第二个活动的onPause()方法将被调用,当您从第三个活动返回时,您可以回到第二个活动的onActivityResult()方法。

请尝试以下代码...

Intent i = new Intent(getBaseContext(), ViewPlaylist.class);
i.putExtra("id", idPlaylist[position]);
i.putExtra("timer", timerPlaylist[position]);
startActivityForResult(i,RESULT_OK);

0

是的,你可以调用finish()方法。这将结束并销毁那个活动。只需要移除finish()方法的调用即可。它仅在您想要销毁一个活动时才需要。


在另一个项目中,每次我启动新的活动时,我都调用了finish(),这解决了OOM错误。 - Gabrielle
我移除了finish(),但onStop仍然被调用...为什么? - Gabrielle
@Gabrielle onStop()方法被调用是因为你的活动页面不再对用户可见,播放列表内容所在的类将其覆盖。这是Android应用程序正常的生命周期流程。在我的答案中,我放置了一个链接,您可以了解有关如何调用这些生命周期方法以及它们何时被调用的更多信息。 - user

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