onRestart()在后退按钮命中时被调用,有什么方法可以防止这种情况发生?

时间:2011-12-05 18:35:18

标签: android onresume

我的应用程序在新推出时会调用一些Web服务。如果用户启动应用程序(在后台运行)并恢复,我还想调用这些Web服务。我已经研究了在启动应用程序和活动聚焦时触发的所有方法。 onStart(),onResume(),onRestart()等....

我认为onRestart是一个很好的选择,可以进行我的网络服务调用并更新我的视图,问题是如果我从活动A(进行呼叫的人)转到活动B并点击后退按钮,活动A将触发onRestart()并调用Web服务。每次我从应用程序中的某些活动返回主屏幕时,我都不希望这种情况发生。如果我的应用程序活动A从外部聚焦,我只希望调用服务。他们应该注意的任何其他事件对我有帮助吗?如果我按下主页按钮,然后点击我的应用程序图标,它应该更新,但如果我点击主屏幕上的内容,打开新活动,然后点击后退按钮,则不会更新。

希望这个问题有道理。

感谢。

3 个答案:

答案 0 :(得分:8)

根据Activity lifecycle,我会在onRestart之前调用onResume。因此,如果您将网络电话放在onResume中,则会在活动首次启动时及其恢复时调用。仅当用户导航回该活动时才会调用onRestart。因此,您可以在活动中使用布尔值(例如布尔值isActivityRestarting)设置为false,然后在onRestart中设置为true。如果在onResume被击中时为真,那么请不要进行网络通话。

示例代码:

public void onRestart() {
    isActivityRestarting = true;
}

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

    isActivityRestarting = false;
}

答案 1 :(得分:4)

onCreate是你最好的选择,但有一些警告。 (这里的主屏幕是调用webservice的屏幕)

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

到目前为止一切顺利,这就是问题所在。

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

对于你的问题,onCreate是进行轻微检查的方法。

使用onStartonRestart解决

您可以执行的一项检查是将时间戳存储在共享首选项中,这与您调用Web服务时相对应。现在,当用户退出(无论是通过HOME还是BACK键)并返回时,您可以检查时间并将其与存储的时间进行比较。如果差异很大,只需进行Web服务调用即可。要完成这项工作,您必须使用onStartonRestart

答案 2 :(得分:1)

由于这是正常行为(请参阅http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle),我建议不要尝试反对它,而是使用生命周期方法。

无论是来自其他活动还是其他活动,您的应用都将从外部聚焦。

也许您应该调用onCreate中的服务?