web-dev-qa-db-ja.com

アクティビティのライフサイクル-すべての向きが変更されるとonCreateが呼び出されます

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

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はアプリケーションの存続期間中に1回呼び出される必要があります。私はこれについて間違っていますか?デバイスの向きを変えると、アクティビティが再作成されますか?

54
Synesso

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

47
Ash
Android:configChanges="keyboardHidden|orientation|screenSize"

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

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

77
achellies

向きが変わったときに何が起こるか

オリエンテーションのライフサイクル

_onPause();
onSaveInstanceState();
onStop();
onDestroy();

onCreate();
onStart();
onResume();
_

----アプリが再作成され、現在実行中です---

onCreate()で長時間の操作を行い、アクティビティの再作成を防止する場合は、メインフェストにconfigChanges属性を追加します

_<activity Android:name=".MyActivity"
          Android:configChanges="orientation|keyboardHidden|screenSize"
          Android:label="@string/app_name">
_

screenSize APIをターゲットにした場合> = 13

46
Mina Fawzy

画面を回転させるときのアクティビティライフサイクル

onPause
onSaveInstanceState
onStop
onDestroy

onCreate
onStart
onRestoreInstanceState
onResume
15
Phan Van Linh

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

これは、次を使用してアクティビティの再現を防止する代替ソリューションです。

Android:configChanges="keyboardHidden|orientation"

アクティビティのレイアウトはポートレートとランドスケープ(レイアウト、レイアウトランド)で異なる場合があります。向きの変更時に再作成を防ぐと、アクティビティが他の向きのレイアウトを使用できなくなります。

11
josephus

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

              }
            }

それは魅力のように動作します!!

9
SAHIL

はい、アクティビティのonCreate()orientationが変更されるたびに呼び出されますが、re-creation of Activityを追加してconfigChanges attribute of Activity of your AndroidManifest file in activity tag。

Android:configChanges="keyboardHidden|orientation"
8
Lalit Poptani

オリエンテーションの変化に対処するための最も一般的で推奨される「解決策」の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/

実装するのは少し面倒に思えるかもしれませんが、向きの変更を適切に処理すると、いくつかの利点が得られます。余分なコードなしで着信通話からの中断。

4
Andrius Darulis

つかいます

Android:configChanges="keyboardHidden|orientation" in Manifest XML activity Tag

@Override
public void onConfigurationChanged(Configuration newConfig) {
    // TODO Auto-generated method stub
    super.onConfigurationChanged(newConfig);
}

上記のコードを使用して、アクティビティの方向に関する変更を実行しますJava Code

乾杯!!!

4

私のやり方をご覧ください:-

http://animeshrivastava.blogspot.in/2017/08/activity-lifecycle-oncreate-beating_3.html

スニペットは:-

@Override
    protected void onSaveInstanceState(Bundle b)
    {
            super.onSaveInstanceState(b);
        String str="Screen Change="+String.valueOf(screenChange)+"....";
            Toast.makeText(ctx,str+"You are changing orientation...",Toast.LENGTH_SHORT).show();
        screenChange=true;

    }

    @Override
    public void onCreate(Bundle b)
        {
        super.onCreate(b);
        ctx=getApplicationContext();
        if(!screenChange)
        {
             String str="Screen Change="+String.valueOf(screenChange);
2