我有一个包含服务连接的活动。当方向改变时,ServiceConnection 似乎会丢失并重新创建。
这是不可取的。我希望通过重新创建 Activity 来维护 ServiceConnection。我正在寻找一个很好的模式来解决这个问题。
我有一个包含服务连接的活动。当方向改变时,ServiceConnection 似乎会丢失并重新创建。
这是不可取的。我希望通过重新创建 Activity 来维护 ServiceConnection。我正在寻找一个很好的模式来解决这个问题。
不幸的是,使用 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 会取回由单例管理的连接,并且可以在不丢失信息的情况下使用它。
看看 Activity.onRetainNonConfigurationInstance() 和相关的 getLastNonConfigurationInstance() 方法——它们可能有用。
在清单的活动属性中使用 android:configChanges="orientation"。