Android:如何在用户按下主页而不是屏幕旋转时断开连接?

时间:2011-07-12 10:03:30

标签: android android-lifecycle ondestroy

我正在开发一个为多种目的维护连接的应用程序,例如发布接收位置更新。根据Android的做事方式和来自其他答案的建议,我没有覆盖在屏幕旋转中销毁和重新创建应用程序的默认android行为,事情在这方面确实很好用。

我保持与onRetainNonConfigurationInstance方法的连接。问题是我想在用户按Home时关闭连接,应用程序被最小化或由于某些其他原因失去焦点但不是在屏幕旋转时 - 因此我无法在onPause,onStop或OnDestroy中执行此操作一些检查,因为它们在配置更改时被一个接一个地调用。就像现在一样,我使用isFinishing()来检查应用程序是否正在关闭 - 但是用户按Home的情况并不需要isFinishing()== true(这是有意义的)。

我想到的一个解决方案是检查应用程序是否关注处理连接更新的线程,如果已经过了一段时间而没有关注就关闭它 - 但我觉得必须有更好的方法来做到这一点? / p>

提前感谢您的时间。

(阅读发布的答案后,编辑清理活动生命周期和onRetainNonConfigurationInstance)

3 个答案:

答案 0 :(得分:1)

我终于在Activity中找到了钩子方法onUserLeaveHint(),这至少对我目前看到的情况做了我想做的事情。也就是说,由于配置更改,连接在重新启动期间保持打开,但在用户按下主页或返回时关闭。因此,我最终得到的解决方案类似于下面的代码。与问题无关的一切都被剪掉了,名字也被简化了。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (m_connection == null) {
        Connection connection = (Connection) getLastNonConfigurationInstance(); // Try to get a saved version of the connection
        if (connection != null) {
            m_connection = connection;
        }
        else {
            m_connection = new Connection(); // Else create a new one
        }
    }
}

@Override
protected void onStart() {
    super.onStart();
    // The activity is about to become visible, connect.
    if (!m_connection.isConnected())
        m_connection.connect();
}

@Override
protected void onResume() {
    super.onResume();
    // The activity has become visible (it is now "resumed").
    m_bUserLeaving = false;
}

@Override
protected void onStop() {
    super.onStop();
    // The activity is no longer visible (it is now "stopped").
    if (m_bUserLeaving && m_connection.isConnected()){ // Disconnect if we stopped because the user left
        m_connection.disconnect();
    }
}

@Override
protected void onDestroy() {
    super.onDestroy();
    if (isFinishing() && m_connection.isConnected()) { // Often means that the user pressed back
        m_connection.disconnect();
    }
}

@Override
public Object onRetainNonConfigurationInstance() {
    // If we get the chance, keep our connection for later use
    return m_connection;
}

@Override
protected void onUserLeaveHint() {
    m_bUserLeaving = true;
}

答案 1 :(得分:0)

据我所知,你应该处理设备旋转并保留旋转完成后你想要维持的所有值/动作。
对于主页按钮按下,使用onPause()停止网络活动,onResume()重新启动它

答案 2 :(得分:0)

您应该检查this帖子,以便更好地了解活动生命周期及其回调。无需实现某些复杂机制或覆盖HOME按钮单击。您应该在onPause()或onStop()活动回调中简单地发布要在关闭应用程序时运行的所有代码。您可以在上面的链接中找到的区别。希望这会有所帮助。