サービスへのServiceConnectionを保持するアクティビティがあります。向きが変わると、ServiceConnectionが失われたように見え、再作成されます。
これは望ましくありません。アクティビティの再作成を通じてServiceConnectionが維持されるようにしたいと思います。この問題を解決する良いパターンを探しています。
サービスへのServiceConnectionを保持するアクティビティがあります。向きが変わると、ServiceConnectionが失われたように見え、再作成されます。
これは望ましくありません。アクティビティの再作成を通じてServiceConnectionが維持されるようにしたいと思います。この問題を解決する良いパターンを探しています。
Activity.onRetainNonConfigurationInstance()および関連するgetLastNonConfigurationInstance()メソッドを見てください-それらは役に立つかもしれません。
残念ながら、onRetainNonConfigurationInstance/getLastNonConfigurationInstanceを使用するとリークが発生する可能性があります。私の場合(IntentServiceを使用してリモートサーバーにファイルをアップロードします)、次のような考慮されたアクティビティで接続を宣言していました。
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プラグインのおかげで)。
この問題を解決するために(そしてアプリケーションの複雑さのために)、IntentServiceへの接続(およびアクティビティとの通信)を処理するために必要なすべての要素をグループ化するシングルトンを作成しました。したがって、画面を回転させると、作成された新しいアクティビティはシングルトンによって管理されている接続を取り戻し、情報を失うことなくそれを使用できます。
マニフェストのアクティビティプロパティでandroid:configChanges="orientation"を使用します。