9

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

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

希望这个问题有意义。

谢谢。

4

3 回答 3

8

根据Activity的生命周期onRestart会在之前被调用onResume。因此,如果您将网络调用放入onResume,它将在活动第一次开始和任何时候恢复时调用。onRestart仅在用户导航回该活动时调用。因此,您可以在活动中设置一个布尔值(例如 boolean isActivityRestarting),将其设置为 false,然后在onRestart. 如果命中时onResume为真,则不要进行网络通话。

示例代码:

public void onRestart() {
    isActivityRestarting = true;
}

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

    isActivityRestarting = false;
}
于 2011-12-05T19:12:06.050 回答
4

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

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

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

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

对您而言, onCreate 是一种进行轻微检查的方法。

Soln 如果使用onStartor onRestart

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

于 2011-12-05T19:00:20.240 回答
1

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

您的应用程序正在从外部获得关注,无论是来自其他活动还是其他活动。

也许您应该调用服务onCreate

于 2011-12-05T18:55:30.050 回答