默认情况下,Activity在Configuration变化(比如设备横竖屏切换)时,会执行onDestory()周期函数,然后onCreate(),重新创建Activity。之所以这样是因为这样可以让Activity动态适应Configuration,比如横屏时使用横屏的layout,drawable等resources,竖屏时使用竖屏的layout,drawable等resources。重启Activity可能导致大量数据的重新获取,网络连接的重新建立等问题,用户体验非常差。Android Dev guide给出两种解决方案
1)在Configuration变化时,保持数据不变
2)你自己处理,而不是重启Activity
下面分别详细介绍一下这两种方法
1)在Configuration变化时,保持数据不变。需要注意的是我们不应该保存那些依赖Activity的数据,比如Drawable,Adapter,View或者任何与Context相关联的数据。因为上一个Activity已经没有了,如果你还要保持这些资源的引用,可能导致资源泄露。使用方法如下:
重写Activity.onRetainNonConfigurationInstance(),保存数据
@Override
public Object onRetainNonConfigurationInstance() {
final MyDataObject data = collectMyLoadedData();
return data;
}
在onCreate()中调用getLastNonConfigurationInstance(),获取onRetainNonConfigurationInstance()保存的数据
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final MyDataObject data = (MyDataObject) getLastNonConfigurationInstance();
if (data == null) {
data = loadMyData();
}
...
}
2)你自己处理,而不是重启Activity。这种方法相对简单一些,缺点是动态适应差。比如横竖屏切换时需要你自己写代码来使用不同的layout等resource,语言设置的动态改变等,不推荐。使用方法如下:
在AndroidManifiest.xml中为当前的Activity设置android:configChanges
<activity android:name=".MyActivity"
android:configChanges="orientation|keyboardHidden"
android:label="@string/app_name">
重写Activity.onConfigurationChanged(),做一些相应的动作,如果没有则可以不用重写
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Checks the orientation of the screen
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
}
}
详情请参考:http://developer.android.com/guide/topics/resources/runtime-changes.html
分享到:
相关推荐
为了避免这种情况,可以在AndroidManifest.xml中为相应Activity设置`android:configChanges="orientation|screenSize"`,然后在Activity中覆盖onConfigurationChanged()方法,处理横竖屏切换。 ```xml android:...
在处理横竖屏切换时,有两种主要策略: 1. **默认行为**:不指定`android:configChanges`,Android系统会在屏幕方向改变时销毁并重建Activity。这时你需要在`onSaveInstanceState()`中保存状态,在`onCreate()`或`...
在Android平台上开发一款支持横竖屏切换的视频播放器是一项常见的任务,这涉及到对Android多媒体框架的深入理解和屏幕适配策略。"Android视频播放器(支持横竖屏切换)"这个项目的核心目标是创建一个能够根据设备...
在Android开发中,横竖屏切换是常见的...通过这个Demo源码,你可以了解到Android如何处理横竖屏切换,如何保存和恢复状态,以及如何设计响应屏幕方向变化的布局。这将有助于你构建更健壮、更具适应性的Android应用。
综上所述,“LandscapePortraitDemo”项目将展示如何在Android Studio中实现Activity的横竖屏切换,处理WebView的加载,以及对Activity生命周期的精细控制。通过对这些关键点的掌握,开发者能够构建出适应各种屏幕...
"OrientationSwitchDemo"这个项目可能包含了处理横竖屏切换的代码示例,可以查看它的`MainActivity`类,看看如何处理`onConfigurationChanged()`,以及如何在布局文件中为不同方向提供资源。 理解并掌握Android的...
本资料"安卓Android源码——(横竖屏切换处理).rar"很可能是针对这一主题的一个实践示例或教程,包含了关于如何处理横竖屏切换的详细代码实现。下面将详细讲解这个知识点。 1. **横竖屏切换机制**: 安卓系统允许...
Fragment的概念在Android 3.0(API级别11)引入,为开发者提供了更大的灵活性来设计多屏幕应用,特别是在处理横竖屏切换时。本项目"fragment横竖屏切换demo"是一个实际操作的例子,展示了如何利用Fragment来实现横竖...
本Demo主要展示了如何利用zxing库实现一个支持横竖屏切换的二维码扫描功能。ZXing,全称Zebra Crossing,是一个开源的条码处理库,支持多种格式的条码和二维码扫描。 首先,我们需要在项目中集成zxing库。这里使用...
在Android开发中,横竖屏切换是一个常见的需求,它涉及到屏幕方向变化时应用程序的处理方式。本Demo旨在演示如何在Android应用中实现横竖屏的切换,并妥善处理屏幕旋转带来的影响。下面将详细介绍这个主题。 1. **...
理解Fragment的生命周期、如何在Activity中添加和管理Fragment,以及如何处理横竖屏切换时的状态保存,是每个Android开发者必须掌握的基本技能。在实际项目中,还需要注意性能优化和用户体验,确保应用在各种场景下...
本资源“Android应用源码之(横竖屏切换处理).zip”提供了相关的源码示例,旨在帮助开发者理解和掌握如何处理横竖屏切换时的问题。 在Android系统中,横竖屏切换默认会导致Activity重建,这可能导致UI布局的改变和...
在Android开发中,横竖屏切换是常见的需求,尤其在设计多样的用户界面和优化用户体验时。本示例"android_横竖屏切换demo"旨在教你如何在Android应用中实现屏幕方向的自由转换,包括从横屏切换到竖屏以及从竖屏返回横...
- 当`android:configChanges`被设置后,应用需要在Activity中重写`onConfigurationChanged(Configuration newConfig)`方法,以处理横竖屏切换。在这里,可以判断`newConfig.orientation`来区别当前屏幕方向,并相应...
下面我们将详细讨论如何在Android的WebView中播放网上视频,并处理横竖屏切换。 首先,我们需要了解WebView的基本用法。在XML布局文件中添加WebView组件,并在对应的Activity或Fragment中初始化并加载网页: ```...
这个“安卓横竖屏切换源程序”应该包含了一些处理横竖屏切换的核心代码和示例。开发者可以参考这些代码,根据自己的应用需求进行调整和集成。例如,你可能需要在特定条件下切换屏幕方向,或者在横竖屏间切换时有特定...
- 在Android项目中,为了处理横竖屏切换,开发者通常会在`res`目录下创建`layout-land`和`layout-port`两个子目录。`layout-land`用于放置横屏布局文件,而`layout-port`用于放置竖屏布局文件。这两个目录下的布局...
总的来说,Android开发者需要根据具体的应用需求来灵活处理横竖屏切换,确保用户在任何屏幕方向下都能获得良好的体验。通过合理设置`AndroidManifest.xml`中的属性和在代码中适当地处理配置变化,可以实现横竖屏切换...
Fragment的设计使得应用在不同设备和屏幕尺寸上表现得更加灵活,尤其在处理横竖屏切换时,可以实现不同布局的适配。在本案例中,“Fragment实现横竖屏布局”主要是指如何利用Fragment来设计适应横竖屏切换的应用界面...
本文主要探讨了如何处理横竖屏切换以及对应的布局加载策略。 首先,横竖屏切换会导致界面布局的变化,因为横屏和竖屏的屏幕尺寸不同。为解决这个问题,Android提供了两种主要方法: 1. 自动切换布局:在`res`目录...