我有一个Activity,它将ServiceConnection保存到服务中。当方向发生变化时,ServiceConnection似乎会丢失并重新创建。
这是不可取的。我希望通过重新创建Activity来维护ServiceConnection。我正在寻找一个解决这个问题的好模式。
答案 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”。