71

にビットマップをロードする単純なアクティビティがありますonCreate。デバイスを回転させると、再度呼び出されたログから確認できることがわかりましたonCreate。実際、すべてのインスタンス変数が再びデフォルト値に設定されているため、Activity 全体が再インスタンス化されていることがわかります。

ビットマップに十分なメモリを割り当てることができないため、2回回転した後、FCを取得します。(アクティビティのすべてのインスタンスはどこかでまだ生きていますか? または、GC のクリーンアップが十分に高速ではありませんか?)

@Override
public void onCreate(Bundle savedInstanceState) {
    File externalStorageDir = Environment.getExternalStorageDirectory();
    File picturesDir = new File(externalStorageDir, "DCIM/Camera");
    File[] files = picturesDir.listFiles(new FilenameFilter(){
        public boolean accept(File dir, String name) {
            return name.toLowerCase().endsWith(".jpg");
        }});
    if (files.length > 0) {
        Bitmap bm = BitmapFactory.decodeStream(new FileInputStream(files[0]));
        ImageView view = (ImageView) findViewById(R.id.photo);
        view.setImageBitmap(bm);
    }
}

私が読んだすべてから、 onCreate はアプリケーションの存続期間中に一度呼び出される必要があります。私はこれについて間違っていますか?デバイスの向きを変えると、どのようにアクティビティが再作成される可能性がありますか?

4

13 に答える 13

87
android:configChanges="keyboardHidden|orientation|screenSize"

注意: Android 3.2(APIレベル13)以降、デバイスが縦向きと横向きを切り替えると、「画面サイズ」も変化します。したがって、APIレベル13以上(minSdkVersionおよびtargetSdkVersion属性で宣言されている)で開発するときに方向の変更によるランタイムの再起動を防ぎたい場合は、「orientation」値に加えて「screenSize」値を含める必要があります。つまり、decalareする必要があります android:configChanges="orientation|screenSize"。ただし、アプリケーションがAPIレベル12以下を対象としている場合、アクティビティは常にこの構成変更自体を処理します(Android 3.2以降のデバイスで実行している場合でも、この構成変更によってアクティビティが再開されることはありません)。

http://developer.android.com/guide/topics/resources/runtime-changes.html

于 2012-09-20T00:46:33.703 に答える
57

デフォルトでは、各ローテーション後にアクティビティが再作成されます。この動作は、AndroidManifestconfigChangesのタグの属性でオーバーライドできます。activity詳細とさまざまなオプションについては、http://developer.android.com/guide/topics/resources/runtime-changes.html を参照してください

于 2011-10-01T06:59:09.883 に答える
13

onStop()FC がメモリ不足になるのを防ぐには、またはのリソースの割り当てを解除する必要がありますonPause()。これにより、 で新しいメモリを使用できますonCreate()

これは、アクティビティの再作成を防ぐための代替ソリューションです。

android:configChanges="keyboardHidden|orientation"

アクティビティのレイアウトが縦向きと横向き (レイアウト、レイアウトランド) で異なる場合があります。向きの変更時に再作成を禁止すると、アクティビティが他の向きのレイアウトを使用できなくなります。

于 2011-11-02T15:35:24.360 に答える
11

On Create メソッドは、オリエンテーションを行うたびに呼び出されます。これを回避するには、使用する必要があります

//Define Below in you Manifest file.
           <activity
                  android:name="com.ecordia.activities.evidence.MediaAttachmentView"
                  android:configChanges="keyboardHidden|orientation|screenSize"
            </activity>

//Define Below in your activity. 

         @Override
            public void onConfigurationChanged(Configuration newConfig) {

              super.onConfigurationChanged(newConfig);

              if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
                  //your code
              } else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            //your code

              }
            }

それは魅力のように機能します!!

于 2013-05-07T09:26:33.517 に答える
11

はい、アクティビティは変更されるたびonCreate()に呼び出されますが、ファイルのアクティビティ タグにofを追加することで oforientationを回避できます。re-creationActivityconfigChanges attributeActivityAndroidManifest

android:configChanges="keyboardHidden|orientation"
于 2011-10-01T06:59:36.060 に答える
8
于 2011-10-01T07:39:37.763 に答える
6

向きの変化に対処するための最も一般的で提案されている「解決策」の 1 つは、向きの変化に対処しないことです。これを行うには、以下に示すように、AndroidManifest.xml のアクティビティに android:configChanges フラグを設定します。

<activity
    android:name=".MyActivity"
    android:label="@string/title_my_activity"
    android:configChanges="orientation|screenSize|keyboardHidden" />

これは、向きの変更を処理する正しい方法ではありません。

正しい方法は、onSaveInstanceState メソッド (これは Activity、Fragment、またはその両方にある可能性があります) を実装し、メソッドに渡される Bundle 引数に保存する必要がある値を配置することです。

ここでうまく説明されています:http://code.hootsuite.com/orientation-changes-on-android/

実装するのは少し面倒に思えるかもしれませんが、向きの変更を適切に処理すると、いくつかの利点が得られます。縦向きと横向きで別のレイアウトを簡単に使用できるようになり、メモリ不足の状況などの多くの例外的な状態を処理できるようになります。追加のコードなしで、着信通話からの割り込み。

于 2016-08-31T10:04:42.260 に答える
-3

私は同じ問題を抱えていて、いくつかの回避策を講じました

false 値を持つ didLoad ブール変数を定義する

プライベート ブール値 didLoad = false;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity);

    if (!this.didLoad){
        // Your code...
        this.didLoad = true;
    }
于 2016-06-28T09:48:03.873 に答える