活动生命周期 – 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
文件中添加Activity
的configChanges 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; }