onCreate 与 onStart 中的 GoogleAPIClient 连接
Posted
技术标签:
【中文标题】onCreate 与 onStart 中的 GoogleAPIClient 连接【英文标题】:GoogleAPIClient Connection in onCreate vs onStart 【发布时间】:2018-04-19 06:15:09 【问题描述】:摘自Google API Client documentation,
public GoogleApiClient.Builder enableAutoManage (FragmentActivity
fragmentActivity, GoogleApiClient.OnConnectionFailedListener
unresolvedConnectionFailedListener)
在支持库中启用自动生命周期管理 在 onStart() 中连接客户端并断开连接的 FragmentActivity 它在 onStop() 中。
它适当地处理用户可恢复的错误并调用 onConnectionFailed(ConnectionResult) 在 unresolvedConnectionFailedListener 如果 ConnectionResult 没有 解决。这消除了与 使用 GoogleApiClient。
虽然听起来有点幼稚,但我的问题是,这是否是我们在 onStart
方法中开始连接 GoogleAPIClient 的重要步骤?如果我改为在onCreate
中建立连接,会有什么危害吗?由于遗留代码,我有多个场景需要连接到onCreate
中的 googleApiClient。我也尝试在 onCreate 中建立连接并且有效(我没有看到任何崩溃)。这是个坏主意吗?那么为什么在onStart
中启动连接并在onStop
中停止连接是必要或重要的呢?
【问题讨论】:
【参考方案1】:你可以参考这个帖子:What does onStart() really do? - android
onStart()
在活动从停止状态恢复时被调用。例如,如果您有活动 A 并从中启动活动 B,则活动 A 将暂停 (onPause()
) 然后停止 (onStop()
) 并移至后退堆栈。在此之后,如果您按 Back 进入您的活动 B,B 将被暂停(onPause()
)、停止(onStop()
)和销毁(onDestroy()
),并且活动 A 将从后堆栈恢复,启动(@987654329 @) 并恢复 (onResume()
)。可以看到,系统不会再为A调用onCreate()
。如何使用
onStart()
?例如,您应该在onStop()
中取消注册 GPS、传感器等的侦听器,然后在onStart()
中再次注册。如果您在onCreate()
注册它并在onDestroy()
注销它,那么 GPS 服务将一直工作,它会耗尽电池。
还有人说onStart()
的主要作用是在activity被暂停后调用的时候。如果onCreate()
被调用,那么所有的初始化都应该重新进行,通过使用onStart()
我们可以初始化那些在onstop()
中没有初始化的东西。
【讨论】:
【参考方案2】:将代码从onStart
移动到onCreate
会导致问题。举个例子,一个使用位置服务在地图上显示位置的应用程序。这是一个行为良好的应用程序,当用户不再使用该应用程序时,它会停止使用定位服务onStop
。
-
用户启动应用程序(
onCreate
,onStart
)
用户离开 (onStop
)
用户在应用程序被销毁之前返回应用程序(onStart
,但不是onCreate
)
如果您仅在onCreate
上连接,这意味着在第 3 步之后应用程序未连接。用户将在没有正确功能的情况下使用应用程序,因为在返回应用程序时可能不会调用 onCreate
。
【讨论】:
感谢@mattm 的回复。但是,如果您说自己处理连接,它不会引起任何问题吗?这只是建议正确而不是必须做对吗?在异常等中运行? @Ahmed 在我提供的示例中,应用程序不会崩溃但无法运行。即使您自己管理连接也会发生这种情况。 那么完美的解决方案是什么?单独说明:EnableAutoManage 似乎也不稳定。以上是关于onCreate 与 onStart 中的 GoogleAPIClient 连接的主要内容,如果未能解决你的问题,请参考以下文章
AndroidX 迁移后,ListView 未在 OnCreate/OnStart 上显示任何数据
如果在 Activity 更改时调用 onCreate 和 onStart 两者之间的区别在哪里?目的是啥?