研究目的のためだけに、簡単なチャットアプリケーションを開発しようとしています。私の問題は、画面の向きが変わると、TCP/IP 接続が閉じられ、向きが変わった後に再作成されることです。
向きを変えると、Android がアクティビティを破棄して再作成することを知っています。
だから私の質問:ビューだけを変更して、他のすべてをそのままにしておくことは可能ですか?
ありがとう
TCP/IP 通信をサービスとして実装する必要があります。そうすれば、向きの変更やその他のアクティビティの再作成に依存しなくなります。
ランタイムの変更の処理ドキュメントで構成の変更を自分で処理するというセクションを読みたいと思っています。つまり、 AndroidManifest の Activity 宣言に追加することで、それらを手動で処理することを伝えます。次に例を示します。android:configChanges="orientation|keyboardHidden"
<activity android:name=".MyActivity"
android:configChanges="orientation|keyboardHidden"
android:label="@string/app_name">
そして、アクティビティで次のonConfigurationChanged
ようにオーバーライドします。
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Checks the orientation of the screen
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
}
}
アクティビティから接続を作成しないでください。代わりにアプリケーションを使用できます。
あなたのマニフェストで:
<application
android:name=".MyApplication" ...>
一度作成されると、アクティビティが破棄された場合でも、アプリケーションの全期間にわたって存続します。
他の代替手段はサービスです。チャット アプリケーションの場合は、バックグラウンド ネットワーク作業を UI から完全に分離するため、これを使用します。
!= null の場合は、接続を静的にして再作成しないか、シングルトン パターンを使用する別のクラスにラップすることもできます。
ここでの本当の問題は、メインの UI スレッドで TCP/IP 接続を実行していることです。これは、タッチ イベントとレイアウトの生成をブロックするリスクがあるため、ひどい考えです。NetworkOnMainThreadException
最近のほとんどの新しいデバイスでは、この動作も防ぐためにAがスローされます。
私がすることは、TCP/IP 接続を でラップしThread
、. が破棄された場合でも がメモリに残るため、これにより構成の変更が保護されます。このアプローチの詳細については、こちらをご覧ください。Thread
Fragment
setRetainInstance(true)
Thread
Fragment
Activity
TCP/IP 接続が複数のActivity
インスタンスにわたって存在する必要がある場合は、Service
代わりに a を使用する必要があります。