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
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)
它会像魅力一样!
是的,活动的onCreate()
被称为每次当orientation
变化,但可以避开re-creation
的Activity
,加入configChanges attribute
的Activity
你AndroidManifest
在活动标签文件.
android:configChanges="keyboardHidden|orientation"
Run Code Online (Sandbox Code Playgroud)
清单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/
尽管实现起来似乎有些乏味,但正确地处理方向变化会为您带来以下好处:您将能够轻松地在纵向和横向方向上使用备用布局,并且能够处理许多特殊状态,例如内存不足的情况以及没有任何额外代码的来电打扰。
归档时间: |
|
查看次数: |
78017 次 |
最近记录: |