活动生命周期 – onCreate调用每个redirect

我有一个简单的活动,加载在onCreate位图。 我发现,如果我旋转设备,我可以从日志中看到onCreate再次调用。 事实上,因为所有的实例variables都设置为默认值,我知道整个活动已被重新实例化。

旋转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应该在应用程序的生命周期中调用一次。 我错了吗? 如何重新定位设备导致活动被重新创build?

每次旋转后默认重新创build活动。 您可以使用AndroidManifest中的activity标签的configChanges属性来覆盖此行为。 有关更多详细信息和不同选项,请参阅http://developer.android.com/guide/topics/resources/runtime-changes.html

 android:configChanges="keyboardHidden|orientation|screenSize" 

注意:从Android 3.2(API级别13)开始,当设备在纵向和横向之间切换时,“屏幕大小”也会改变。 因此,如果要在API级别13或更高级别(由minSdkVersion和targetSdkVersion属性声明)开发时防止因方向更改而导致运行时重新启动,则除了“方向”值之外,还必须包含“screenSize”值。 也就是说,你必须decalare android:configChanges="orientation|screenSize" 。 但是,如果您的应用程序的目标级别为12或更低,那么您的活动始终会自行处理此configuration更改(即使在Android 3.2或更高版本的设备上运行,此configuration更改也不会重新启动您的活动)。

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

当方向改变时会发生什么?

定位的生命周期

 onPause(); onSaveInstanceState(); onStop(); onDestroy(); onCreate(); onStart(); onResume(); 

—-应用程序重新创build,现在正在运行—

如果你在onCreate()做了很长时间的操作,并且想阻止重新创build你的activity, configChanges在你的configChanges中添加configChanges属性

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

screenSize如果你的目标是> = 13

如果您想防止FC内存不足,则需要取消分配onStop(或onPause)中的资源。 这可以让你在onCreate中使用新鲜的内存。

这是通过使用防止活动的再现的替代解决scheme

机器人:configChanges = “keyboardHidden |方向”

因为有时您的活动布局在纵向和横向(布局,布局)不同。 防止重新定向改变会阻止你的活动使用其他方向的布局。

是的,活动的onCreate()方法每次调用时都会调用,但是您可以通过在activity标签的AndroidManifest文件中添加ActivityconfigChanges attribute来避免re-creation Activity

 android:configChanges="keyboardHidden|orientation" 

在创build方法会每次调用时做你的方向,以避免这个你必须使用

 //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 } } 

它会像魅力一样工作!

使用

Manifest XML活动标签中的android:configChanges =“keyboardHidden | orientation”

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

使用上述代码在活动Java代码中执行与方向相关的更改

干杯!!!

处理方向变化的最常见和最有希望的“解决scheme”之一就是不要处理它们。 你可以通过在AndroidManifest.xml的Activity中设置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/

尽pipe实现起来可能有点繁琐,但正确地处理方向更改可以带来以下好处:您将能够轻松地在纵向和横向方向上使用备用布局,并且您将能够处理许多exception状态,如低内存情况以及来电打断,无需额外的代码。

当你旋转屏幕的时候生命周期

 onPause onSaveInstanceState onStop onDestroy onCreate onStart onRestoreInstanceState onResume 

请看我的做法:

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); 

我有同样的问题,其中我的onCreate被调用多次屏幕方向改变。 我的问题得到解决,当我在manifest中的activity标记中添加android:configChanges="orientation|keyboardHidden|screenSize"

我有同样的问题,我做了一些解决方法

定义带有假值的didLoad布尔variables

private boolean didLoad = false;

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity); if (!this.didLoad){ // Your code... this.didLoad = true; }