活动生命周期 - onCreate呼吁每次重新定位

Syn*_*sso 58 android activity-lifecycle

我有一个简单的活动加载位图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);
    }
}
Run Code Online (Sandbox Code Playgroud)

从我读到的所有内容中,onCreate应该在应用程序的生命周期中调用一次.我错了吗?如何重新定位设备会导致重新创建活动?

小智 79

android:configChanges="keyboardHidden|orientation|screenSize"
Run Code Online (Sandbox Code Playgroud)

注意:从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

  • 我不得不用它来覆盖所有基础:`keyboard | keyboardHidden | orientation | screenLayout | uiMode | screenSize | smallestScreenSize` (4认同)

Ash*_*Ash 50

默认情况下,每次轮换后都会重新创建活动.您可以使用AndroidManifest中标记的configChanges属性覆盖此行为activity.有关更多详细信息和不同选项,请参阅http://developer.android.com/guide/topics/resources/runtime-changes.html


Min*_*wzy 50

方向改变时会发生什么

定向生命周期

onPause();
onSaveInstanceState();
onStop();
onDestroy();

onCreate();
onStart();
onResume();
Run Code Online (Sandbox Code Playgroud)

---- app重新创建,现在正在运行---

如果您长时间操作onCreate()并希望阻止configChanges在主节点中重新创建活动添加属性

<activity android:name=".MyActivity"
          android:configChanges="orientation|keyboardHidden|screenSize"
          android:label="@string/app_name">
Run Code Online (Sandbox Code Playgroud)

如果您将目标定为api> = 13,则使用screenSize


Pha*_*inh 17

旋转屏幕时的Actvity生命周期

onPause
onSaveInstanceState
onStop
onDestroy

onCreate
onStart
onRestoreInstanceState
onResume
Run Code Online (Sandbox Code Playgroud)


jos*_*hus 12

如果要防止FC内存不足,则需要在onStop()或中取消分配资源onPause().这允许你使用新的内存onCreate().

这是一种通过使用来防止重新活动的替代解决方案

android:configChanges="keyboardHidden|orientation"

有时,您的活动布局在纵向和横向(布局,布局 - 土地)方面有所不同.防止在方向更改时重新创建将阻止您的活动使用其他方向的布局.


SAH*_*HIL 10

每当你做方向时,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

              }
            }
Run Code Online (Sandbox Code Playgroud)

它会像魅力一样!


Lal*_*ani 9

是的,活动的onCreate()被称为每次当orientation变化,但可以避开re-creationActivity,加入configChanges attributeActivityAndroidManifest在活动标签文件.

android:configChanges="keyboardHidden|orientation"
Run Code Online (Sandbox Code Playgroud)


Him*_*ani 5

清单XML活动标签:

android:configChanges="keyboardHidden|orientation"???


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

使用以上代码在Activity Java代码中执行与方向相关的更改

干杯!!!


小智 5

处理方向变化的最常见且建议的“解决方案”之一是不对其进行处理。您可以通过在AndroidManifest.xml中的Activity上设置android:configChanges标志来做到这一点,如下所示:

<activity
    android:name=".MyActivity"
    android:label="@string/title_my_activity"
    android:configChanges="orientation|screenSize|keyboardHidden" />
Run Code Online (Sandbox Code Playgroud)

这不是应对方向变化的正确方法。

正确的方法是实现onSaveInstanceState方法(可以在您的Activity和/或Fragment中),并将需要保存的值放在传递给该方法的Bundle参数中。

在这里很好地描述了它:http : //code.hootsuite.com/orientation-changes-on-android/

尽管实现起来似乎有些乏味,但正确地处理方向变化会为您带来以下好处:您将能够轻松地在纵向和横向方向上使用备用布局,并且能够处理许多特殊状态,例如内存不足的情况以及没有任何额外代码的来电打扰。