通过方向更改在Android中维护ServiceConnection

时间:2010-12-06 05:29:03

标签: android android-activity screen-orientation serviceconnection

我有一个Activity,它将ServiceConnection保存到服务中。当方向发生变化时,ServiceConnection似乎会丢失并重新创建。

这是不可取的。我希望通过重新创建Activity来维护ServiceConnection。我正在寻找一个解决这个问题的好模式。

3 个答案:

答案 0 :(得分:1)

看看Activity.onRetainNonConfigurationInstance()和相关的getLastNonConfigurationInstance()方法 - 它们可能有用。

答案 1 :(得分:1)

不幸的是,使用onRetainNonConfigurationInstance / getLastNonConfigurationInstance可能会涉及泄漏。 在我的情况下(我使用IntentService在远程服务器上上传文件),我在所考虑的Activity中声明了我的连接,例如:

private ServiceConnection mConnection = new ServiceConnection() {
    public void onServiceConnected(ComponentName className, IBinder service) {
        mServiceMessenger = new Messenger(service);
        mConnectedToService = true;
    }

    public void onServiceDisconnected(ComponentName className) {
        mConnectedToService = false;
        mServiceMessenger = null;
    }
};

mServiceMessenger是Messenger的一个实例,允许我向上传任务发送取消订单。

然而,当我使用onRetainNonConfigurationInstance和getLastNonConfigurationInstance测试解决方案时,我跟踪(感谢Eclipse中的MAT插件)屏幕旋转涉及我的Activity上下文的大量泄漏。

为了解决这个问题(并且因为我的应用程序复杂性允许我这样做),我创建了一个单独的组合,将处理与IntentService的连接所需的所有元素组合在一起(并与我的Activity进行通信)。因此,在旋转屏幕时,创建的新Activity将返回由单例管理的连接,并且可以使用它而不会丢失信息。

答案 2 :(得分:-2)

在manifest中的activity属性中使用android:configChanges =“orientation”。