第3部:Androidアプリケーションインタフェースガイド---第3節:アプリケーションリソース---第3章実行時の変更処理

7832 ワード

第3章運転時の変更処理
一部のデバイス構成は、画面の横方向レイアウト、キーボードの可用性、言語など、実行中に変更される場合があります.このような変化が発生すると、Androidはこの実行中のActivity(onDestroy()メソッドが呼び出され、onCreate()メソッドが呼び出されます.この再起動の動作は、代替リソースを自動的にアプリケーションにロードすることで、アプリケーションを新しい構成に適応させるためです.
再起動を正しく実行するには、Activityが通常のライフサイクル全体でその前の状態を再保存することが重要です.Androidは、Activityを破棄する前にonSaveInstanceState()メソッドを呼び出してアプリケーションの前の状態に関するデータを保存します.その後、onCreate()メソッドまたはonRestoreInstanceState()メソッドでアプリケーションのステータスを再保存できます.アプリケーションのステータスをそのまま再起動できるようにテストするには、プログラムが異なるタスクを実行している間にアプリケーションの構成を変更すること(画面の方向の変化など)を許可する必要があります.ユーザーが入力した電話に出てアプリケーションに戻るなど、イベントを処理するために、ユーザーデータやステータス情報が失われていない場合、アプリケーションはいつでも自分の能力を再起動する必要があります.しかし、アプリケーションを再起動し、価値のあるデータを大量に保存すると、ユーザー体験が悪くなる可能性があります.このような状況の前で、あなたは2つの選択肢があります.
a構成変更中にオブジェクトを維持する
構成が変更されると、Activityを再起動できますが、新しいActivityインスタンスにステータスのあるオブジェクトを携帯させます.
b自分で構成の変化を処理する
一部の構成が変更された場合、システムがActivityを再起動することを阻止し、構成が変更された場合にコールバックを受信すると、必要に応じてActivityを手動で更新できます.
3.1構成変更中にオブジェクトを維持する
Activityを再起動する場合は、大量のデータを復元したり、ネットワーク接続を再実行したり、他の深い操作を実行したりする必要があります.これにより、構成の変更による完全な起動は、悪いユーザー体験を引き起こします.また、Activityライフサイクルで保存されているBundleオブジェクトだけでは、Activityの状態を完全に維持することはできません.bitmapオブジェクトなどの大きなオブジェクトを渡すことはできません.これらのオブジェクトのデータはシーケンス化され、シーケンス化されなければなりません.これらは、構成を遅くするために多くのメモリを消費する必要があります.このような状況では、Activityが構成変更によって再起動されると、ステータスのあるオブジェクトを再プリセットすることでプログラムの負担を軽減することができます.
実行中の構成変更時にオブジェクトを維持するには、次の手順に従います.
1.onRetainNonConfigurationInstance()メソッドを書き換えて、メンテナンスしたいオブジェクトを返します.
2.Activityが再作成されると、getLastNonConfigurationInstance()メソッドを呼び出してオブジェクトを復元します.
Activityが構成によって変更されて閉じると、AndroidはonStop()メソッドとonDestroy()メソッドの間でonRetainNonConfigurationInstance()メソッドを呼び出します.構成変更後にステータスをより効率的に保存するには、onRetainNonConfigurationInstance()メソッドを実装するときに必要なオブジェクトを返す必要があります.
このシーンの貴重な点は、アプリケーションがネット上から多くのデータをダウンロードする必要があるときです.ユーザーがデバイスの方向を変更し、Activityを再起動した場合、アプリケーションがデータを再ロードする必要がある場合は、遅くなります.必要なのは、o n R e t a i n NonConfigurationInstance()メソッドを実装し、データのあるオブジェクトを返し、ActivityがgetLastNonConfigurationInstance()メソッドで再起動するとデータを取得することです.コードリスト3-1に示すように、
@Override

public Object onRetainNonConfigurationInstance() {

    final MyDataObject data = collectMyLoadedData();

    return data;

}

 
コードリスト3-1
注意:任意のオブジェクトを返す場合は、Drawableオブジェクト、Adapterオブジェクト、Viewオブジェクト、またはContextに関連する他のオブジェクトなど、Activityに関連するオブジェクトを渡さないでください.このようにすると、元のActivityインスタンスのすべてのビューとリソースが漏洩します.(リソースの漏洩は、アプリケーションが保有していることを意味し、ゴミ収集として使用できないため、多くのメモリが失われる可能性があります)
その後、Activityが再起動されると、コードリスト3-2に示すようにデータが取得されます.
@Override

public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);



    final MyDataObject data = (MyDataObject) getLastNonConfigurationInstance();

    if (data == null) {

        data = loadMyData();

    }

    ...

}

 
コードリスト3-2
この例では、getLastNonConfigurationInstance()は、onRetainNonConfigurationInstance()メソッドに保存されているデータを取得します.データが空の場合(Activityの再起動が構成の変更ではなく他の理由で発生した場合)、プログラムは元のデータソースからデータオブジェクトにロードされます.
3.2構成の変更を自分で処理する
特定の構成が変更されている間にアプリケーションがリソースを更新する必要がなく、Activityの再起動を避ける操作制限がある場合は、自分のActivityを宣言して構成の変更を処理し、システムのActivityの再起動を阻止することができます.注意:構成の変更を処理するために自分を選択すると、代替リソースの使用が難しくなります.システムはこれらのリソースを自動的に呼び出すことはありません.このテクノロジーは、ほとんどのアプリケーションでは推奨されていない最後の手段と見なすべきです.
構成の変更を処理するためにActivityを宣言するには、android:configChangesプロパティを含む正しい要素をリストファイルに編集し、処理する構成を表します.Android:configChangesプロパティのすべての可能な値をドキュメントにリストします(最も一般的な値は、スクリーンの方向が変化した場合、keyboardHiddenがキーボードの可用性の変化を処理する場合にorientationが処理します).プロパティに複数の構成の値を宣言し、「|」記号で区切ることができます.
たとえば、次のリストクリップは、コードリスト3-3に示すように、Activityで画面の方向変化とキーボードの可用性変化を同時に処理することを宣言しています.
<activity android:name=".MyActivity"

          android:configChanges="orientation|keyboardHidden"

          android:label="@string/app_name">

 
コードリスト3-3
これらの構成の1つが変更された場合、MyActivityは再起動されません.逆に、このActivityはonConfigurationChanged()メソッドの呼び出しを受信します.このメソッドは、新しいデバイス構成を識別するためにコンフィギュレーションクラスのオブジェクトを渡します.構成フィールドを読み込むことで、新しい構成情報を特定し、インタフェースで使用しているリソースを更新することで、これらの変更を正しく適用できます.このメソッドが呼び出されると、ActivityのResourcesオブジェクトが更新され、新しい構成に基づくResourcesオブジェクトが返されます.したがって、Activityをシステムで再起動することなく、UI要素を簡単にリセットできます.
注意:Android 3.2(API level 13)が開始され、デバイスが縦画面で切り替わると「screen size」という表示も変更されます.したがって、実行時に縦横画面の変更による再起動を阻止するには、APIレベル13以降で「screenSize」の値を追加する必要があります.このようにandroid:configChanges=「orientation|screenSize」です.
たとえば、次のonConfigurationChanged()メソッドでは、コードリスト3-4に示すように、ハードウェアキーボードの可用性と現在のデバイスの方向を確認します.
@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();

    }

}

 
コードリスト3-4
このコンフィギュレーションクラスのオブジェクトは、変更された構成情報だけでなく、現在のすべての構成情報を表します.多くの場合、これらの構成がどのように変更されたかを正確に気にすることはありません.すべてのリソースを簡単に再割り当てし、処理している構成の代替リソースを提供することができます.たとえば、このResourcesオブジェクトが更新されたため、setImageResource(int)メソッドでImageViewをリセットし、現在の構成に適切なリソースをリセットして使用できます.コンフィギュレーションフィールドの値は、コンフィギュレーションクラス内の特定の定数に一致する整数であることに注意してください.ドキュメント内のフィールドごとにその定数を使用する場合は、コンフィギュレーションクラスで該当するフィールドを参照してください.覚えておいてください.Activityを宣言して構成の変更を処理すると、代替リソースを提供するすべての要素をリセットします.画面方向の変更を処理するためにActivityを宣言し、横方向と縦方向の切り替え画像を持つ場合は、onConfigurationChanged()メソッドで各要素にリソースを再指定する必要があります.構成の変化に応じてプログラムを更新する必要がない場合は、onConfigurationChanged()メソッドを実装しないことができます.この場合、構成が変更される前に使用されるすべてのリソースが使用され、Activityが再起動されないようにする必要があります.ただし、アプリケーションは常に閉じられ、以前の状態から完全に再起動できるはずです.これは、いくつかの構成が変更された場合にアプリケーションを再起動することを防止できないだけでなく、ユーザーが電話を受信してアプリケーションに戻るなどのイベントを処理するためです.
本文はjy 02432443から来て、私が苦労して1つの字コードが出てきたので、転載して出典を保留してください、そして法律の責任を追及する権利を保留しますQ 78117253