当点击返回按钮时,onRestart()方法会被调用,有没有办法防止这种情况发生?

9
我的应用程序在刚启动时会调用几个Web服务。如果用户启动并恢复应用程序(该应用程序在后台运行),我还希望调用这些Web服务。我已经研究了所有应用程序启动和活动聚焦时触发的方法,例如onStart()、onResume()、onRestart()等等...
我认为onRestart()是一个很好的选择来进行Web服务调用和视图更新,但问题是,如果我从活动A(正在进行调用)转到活动B并点击返回按钮,活动A将触发onRestart()并调用Web服务。我不希望每次从我的应用程序中的某个活动回到主屏幕时都发生这种情况。我只想在我的应用程序活动A从外部聚焦时调用服务。是否有其他事件我应该知道可以帮助我?如果我按下Home键,然后再按下我的应用程序图标,它应该更新,但如果我在我的主屏幕上点击某个东西,打开一个新的活动,然后点击返回按钮,则不应该更新。
希望问题清晰明了。
谢谢。

当你说“如果用户启动了在后台运行的应用程序”,那么这个应用程序是如何首先进入后台的?是通过按返回按钮还是主页按钮? - havexz
首页按钮,应该提到这一点。 - PaulG
3个回答

8
根据Activity生命周期onRestartonResume之前被调用。如果您将Web调用放在onResume中,它将在首次启动该活动和任何时间恢复时调用。只有当用户导航回到该活动时才会调用onRestart。因此,您可以在活动中设置一个布尔值(例如,boolean isActivityRestarting),其初始值为false,然后在onRestart中将其设置为true。如果onResume时它为true,则不执行Web调用。

示例代码:

public void onRestart() {
    isActivityRestarting = true;
}

public void onResume() {
    if (!isActivityRestarting) {
        executeWebCalls();
    }

    isActivityRestarting = false;
}

2
感谢您的回复。这种方法行不通。我目前正在将所有活动中的每个onResume()、onStart()、onRestart()、onStop()、onPause()等调用打印到日志中。这是我的初始问题,如果我从我的MainScreen(Web服务调用屏幕)点击某些内容并打开活动B,然后按BACK键,它将按以下顺序触发以下方法:onRestart()、onStart()、onResume()。所以根据您的答案逻辑,它会以任何方式调用Web服务。 - PaulG
如果用户使用 HOME 按钮退出我的应用程序,该怎么办?当重新启动应用程序时,它将按照 onRestart()、onStart() 和 onResume() 的顺序调用,因此我确实希望在 onRestart 发生时调用 Web 服务,但不希望在从后退按钮返回时调用。 - PaulG
首先,你需要将网络调用从onCreate中移动出来。我建议将其移动到onResume中。在你的onResume方法的最后一行,将shouldUpdate设置为true。 - Jason Robinson
我应该在何时将shouldUpdate从false重新设置为true,以便能够获取新数据?虽然我考虑过这种方法,但我不知道什么时候将标志重新设置为true。如果我能检测到HOME按钮的按下(在Android上不合法),我可以在那里将其设置为true,并在打开应用程序时调用我的Web服务,但是我不能。我已经尝试了许多方法。 - PaulG
1
请阅读我之前评论的最后一句话。 - Jason Robinson
显示剩余4条评论

4

最好的选择是使用onCreate,但需要注意以下几点。(这里的主屏幕是调用webservice的屏幕)

  • 如果用户在主屏幕上按下返回按钮,则会调用onCreate
  • 如果用户在其他屏幕上按下返回按钮并回到主屏幕,则不会调用onCreate
  • 如果用户使用HOME按钮退出主屏幕,并通过长按HOME按钮并选择您的应用程序返回,则不会调用onCreate

目前为止都很好,但有个问题。

  • 如果用户按HOME按钮退出,然后转到启动器图标,则不会调用onCreate。从理论上讲,这是一致的行为,但可能看起来很奇怪,因为用户可能会认为他/她是从头开始启动应用程序,忘记了最初的退出方式。

对于您的答案,使用onCreate是正确的方法,但需要进行一些检查。

如果使用onStartonRestart

您可以做一个检查,将时间戳存储在共享首选项中,该时间戳对应于您调用web服务的时间。现在,当用户退出(无论是通过HOME键还是BACK键)并回来时,您可以检查时间并将其与存储的时间进行比较。如果差异很大,则只需调用webservice。为使此功能正常工作,您必须使用onStartonRestart


正是我的问题。我现在在OnCreate()中进行Web服务调用,但就像你所说的,当我恢复应用程序时,OnCreate不会被调用。我已经花了大约2个小时研究这些“轻微检查”,但没有找到任何东西。由于明显的原因,我们无法捕获HOME按钮按下事件,我快要崩溃了。 - PaulG
如果用户不退出应用程序,时间差仍可能很高。如果我按BACK键返回到主屏幕,onStart()和onRestart()都将被调用。 - PaulG
2
告诉我一件事,如果用户在某个屏幕上停留了很长时间并且我们进行Web服务调用,由于此时本地数据可能已经过期,这会有任何影响吗?因此,我们的想法是使用基于时间间隔的调用而不是基于生命周期的调用。 - havexz
你说得对,这可能不会对用户造成伤害,因为他们本来就需要新数据。 - PaulG

1

当应用程序恢复时,OnCreate不会被调用。无论如何感谢您。 - PaulG
好的,如果您的应用程序已恢复,您并不总是想调用它,否则您将使用 onResumeonStart,对吧? - skynet
理论上是的,但是无论我从活动B返回到活动A(mainScreen),都会同时调用onResume()和onStart()。我不想每次返回主屏幕时都调用网络服务。 - PaulG
你有一个选择,就是为你的活动使用不同的“launchMode”。请参阅http://developer.android.com/guide/topics/manifest/activity-element.html#lmode。请注意,最后两个选项不建议一般使用。你可以尝试使用第二个选项(`singleTop`),然后在`onNewIntent()`中调用你的Web服务。 - skynet
谢谢Craigy,听起来很不错,但我会把它作为最后的手段来考虑,我相信有更简单的方法来完成这个任务。 - PaulG
显示剩余2条评论

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