连接到Google API客户端时Android活动生命周期的奇怪行为

连接到Google API客户端时Android活动生命周期的奇怪行为,android,android-activity,android-lifecycle,google-api-client,activity-lifecycle,Android,Android Activity,Android Lifecycle,Google Api Client,Activity Lifecycle,在中,它说的是重新启动(强调我的): 当前活动重新显示给用户(用户已导航回)时,在onStop()之后调用。然后是onStart(),然后是onResume() 现在在我的应用程序中,按照建议,我(尝试)连接到onStart中的“谷歌API客户端”,并在onStop中断开连接,就像这样:(简化) 我不小心启动了我的应用程序,并立即按home键将其删除,它进入后台,几秒钟后,突然恢复正常,并开始尝试连接GoogleAppClient。只有在快速按下home键(或overview键)时才会发生这种情

在中,它说的是重新启动(强调我的):

当前活动重新显示给用户(用户已导航回)时,在onStop()之后调用。然后是onStart(),然后是onResume()

现在在我的应用程序中,按照建议,我(尝试)连接到onStart中的“谷歌API客户端”,并在onStop中断开连接,就像这样:(简化)

我不小心启动了我的应用程序,并立即按home键将其删除,它进入后台,几秒钟后,突然恢复正常,并开始尝试连接GoogleAppClient。只有在快速按下home键(或overview键)时才会发生这种情况,也就是说,在连接对话框出现之前(或者换句话说,在调用mgoogleapclient.connect()之前)

经过进一步的测试,很明显,如果我从onStart中删除mGoogleAPIClient.connect(),它将按照预期/要求保留在后台。我还确认,当它发生时,onRestart正在被调用,实际上,它是在调用onStart之前被调用的。然而,这对我来说没有任何意义

如果问题是由mGoogleAPIClient尝试连接引起的(执行此操作时,将活动带回到前台),并且mGoogleAPIClient.connect()正在onStart中调用,该调用在onRestart之后调用,如果事件当时没有发生,onRestart如何知道要调用

我还要确认,我已经从Play Store中尝试了至少两个同样表现出这种行为的其他应用程序


这是一个很容易出现的问题,因为很容易错误地启动某个应用程序,然后立即将其发送到后台。因此,我使用布尔标志实现了一个解决方法,现在,只有在启动时,按home/overview,然后立即重新启动并重新设置应用程序的后台,问题才会发生(在对话开始之前)。我不希望任何人这样做,但我想知道,这是我在这里做错了什么或误解了什么,以及如何停止这种不必要的行为的错误吗?

我认为这是因为connect()发生在后台,您快速按下键会绕过disconnect()(connect()不会设置该状态),因此对于同一连接,它假定即使必须再次启动应用程序,也可以安全地显示对话框

您可以尝试以下操作:

// Check if it is not already connected in onStart()
if(!mGoogleAPIClient.isConnected() || !mGoogleAPIClient.isConnecting()){
    mGoogleAPIClient.connect();
}
其次,在
onStop()
中调用
disconnect()
阻塞:


您正在谈论的“玩游戏”对话框需要一些时间来安排(猜游戏服务必须连接到它们的API),因此可能:

  • 您打开应用程序并调用
    onStart()
  • 客户端开始连接
  • 你关闭应用程序
  • 客户端后台工作成功,应用程序被带到前台
  • onRestart()
    onStart()
    按此顺序调用,正如文档所说。此时,
    connect()
    调用是无用的

由于这是内部行为,在我看来,除了断开客户端
onStop()
。如果您觉得这很重要,您可以尝试提交一个bug/功能请求。

super.onStop()?
在连接对话框出现之前
连接对话框是什么?@iGio90,打字错误更正:-)我想你看错了,在我看来这是第一次调用
onStart
启动对话框。当对话框准备好后,
onRestart
onStart
会再次调用,但是connect()在那一点上是没有用的。我想除了提交bug报告/功能请求之外,你什么也做不了。谢谢@plup\u fiction,不幸的是,这不起作用-同时while循环也不会编译,我得到了一个“Operator”!“不能应用于”void“。我假设因为disconnect方法不返回布尔值(它实际上不返回任何内容):-(Thanks@Zippy:我的错是没有注意到。现在看。@Zippy:还有一件事,你在使用API的自动管理吗?
// Check if it is not already connected in onStart()
if(!mGoogleAPIClient.isConnected() || !mGoogleAPIClient.isConnecting()){
    mGoogleAPIClient.connect();
}
while(true){
    if(mGoogleAPIClient.isConnected()){
    mGoogleAPIClient.disconnect();
    break;
    }
}