`
imagiczhang
  • 浏览: 1783 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

Android横竖屏切换时正确的Activity生命周期管理

 
阅读更多

使用过Android的用户大概都发现,Android系统在横竖屏切换的时候,应用程序的切换会比较慢。其实主要原因是在于横竖屏切换的时候,当前的Activity被销毁一次,再重新创建一次,因此会产生一定的迟滞感。

那Android为什么默认会有这样的行为?如何正确的管理Activity的生命周期?

 

先说一下Android为什么需要销毁当前的Activity,然后重新创建一次。其实这点也不难理解,Android的应用需要适应不同尺寸的屏幕,因此Android Project在res目录下可以针对不同情况,比如不同分辨率、不同dpi、横竖屏等等,存放不同的资源。也就是说,横屏或竖屏时可以采用不同的布局(layout)、不同的图片,由此甚至可以产生在横竖屏时界面完全不同的应用。但这些资源时需要在Activity创建的时候加载的,一旦Activity创建完成,想要重新加载不同的资源,只能重建Activity。

 

那如果Activity在横竖屏时不需要重新加载资源,难道就没有办法防止Activity的销毁和重建吗?

答案是可以,但我搜索了一下,发现很多中文资料中提供的办法都只能在Android 2.x上奏效,所以特地找了一下Android文档,找到了在Android 2.x到4.x都能奏效的方法。方法很简单,就是在Manifest文件里为Activity声明android:configChanges属性。该属性的意思是将configChanges中声明的事件交给Activity自身来处理,发生这些事件时Android不会对Activity进行销毁重建。当事件发生时,Android系统只会回调Activity上的onConfigurationChanged方法。

在Android3.2之前,只要声明android:configChanges="orientation|keyboardHidden"就可以防止Activity重建,但在Android3.2之后,横竖屏切换的时候,还会发生screen size change事件,因此就需要加入screenSize属性。

以下是防止Activity重建的代码示例:

 

      <activity
            android:name="com.example.lifecycletestonorientationchange.MainActivity"
            android:label="@string/app_name"
            android:configChanges="orientation|keyboardHidden|screenSize">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

 

但果真这是最适合的解决方案吗?要回答这个问题,需要先看一下上述方案的前提,上述方法只有在Activity进行横竖屏切换时不需要重新加载资源才可行,不然Android系统不会为Activity重新加载资源。

 

如果需要重新加载Activity资源,有没有可行的优化方案?

如果需要重新加载资源,最方便的方法仍然时销毁Activity并重建,但在这个过程中可以进行一些优化。Activity在销毁和重建的过程会调用onSaveInstanceSate和onRestoreInstanceState方法去持久化和恢复一些状态,这个过程可能会比较耗时。是不是可以不需要这一过程?

Android在Activity中提供了onRetainNonConfigurationInstance方法,该方法中返回的状态对象,不会随Activity销毁,之后Activity重建时,就可以通过getLastNonConfigurationInstance将状态对象找回。需要警惕的是,onRetainNonConfigurationInstance方法不能返回Drawable,Adapter或者View对象,因为这些对象和Activity关系紧密,应当和Activity一起销毁重建,不然使用这种方法可能会造成严重的内存泄漏。

以下是示例代码:

 

    @Override
    public Object onRetainNonConfigurationInstance() {
        final MyStateObject state = getStateObject();
        return state;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final MyStateObject state = (MyStateObject) getLastNonConfigurationInstance();
        if (state == null) {
            state = loadMyState();
        }

    }

即便如此,仍然会有问题,原因在于Android api level 13就把onRetainNonConfigurationInstance标记为deprecated,(毕竟如果用错了该方法,会造成严重的内存泄漏,这不是Google愿意看到的),继续使用会有风险,那一天该方法被移除了,那继续使用该方法的应用会出现闪退的情况,因此需要使用替代的API。在Android文档中,该方法已被Fragment中的setRetainInstance(boolean)替代,所以建议大家在写Activity时,如果需要使用该功能时,最好都在Activity中加入Fragment。

 

分享到:
评论

相关推荐

    android 横竖屏切换生命周期

    android activity 执行屏幕横竖屏切换的时候activity声明周期执行的竖屏的时候点击横屏 09-04 15:54:27.675: I/yxd(6708): 应用程序执行了============onPause===方法===&gt;&gt; 09-04 15:54:27.685: I/yxd(6708): 应用...

    android安卓横竖屏切换效果、webview加载以及生命周期监测

    在Android开发中,横竖屏切换是常见的应用场景,它涉及到Activity的生命周期管理和用户界面的适配。本项目“LandscapePortraitDemo”旨在演示如何在Android Studio中处理这一问题,同时结合WebView的加载以及...

    横竖屏切换Activity生命周期

    在Android应用开发中,横竖屏切换是常见的用户交互场景,它涉及到Activity的生命周期管理。Activity是Android系统中用户界面的基本单元,它承载了应用程序的主要交互逻辑。当设备从竖屏旋转到横屏,或者反之,...

    android横竖屏切换时候Activity的生命周期

    正确处理横竖屏切换时的Activity生命周期对于打造流畅且高效的Android应用至关重要。开发者需要理解系统在不同情况下的生命周期调用顺序,并通过合理的方法来处理Activity状态的保存与恢复,确保用户体验的连贯性和...

    Fragment的使用,隐藏显示以及androidPad横竖屏切换

    在Android应用开发中,Fragment是Android SDK提供的一种组件,它允许开发者在单个Activity中创建多个可重用的UI部分。...熟练掌握Fragment的使用和管理,以及应对横竖屏切换,将有助于你创建更优质的Android应用。

    Android横竖屏切换处理Demo源码.rar

    这份"Android横竖屏切换处理Demo源码"提供了一个很好的学习示例,帮助开发者理解和处理这一问题。以下是对这个Demo源码中涉及的知识点的详细解析: 1. **Activity生命周期与横竖屏切换**: 当设备屏幕方向发生变化...

    android横竖屏切换

    通过以上讲解,我们可以理解Android横竖屏切换的基本原理和实践技巧。这个Demo提供了一个实际的示例,帮助开发者更好地理解和掌握这一功能的实现。在实际项目中,根据具体需求灵活运用这些知识,可以提升应用的用户...

    Android手机横竖屏切换过程中避免生命周期的变化的方法.pdf

    当Android手机进行横竖屏切换时,Activity的生命周期默认会发生变化,这可能导致数据丢失、用户体验中断,特别是在需要保持状态的游戏或复杂应用中尤为明显。本篇将详细探讨如何避免这种生命周期变化,以确保在横竖...

    【Android每周专题】横竖屏切换

    Android系统允许应用在设备旋转时自动调整布局,这得益于Android的资源配置和Activity生命周期管理。当设备从横屏切换到竖屏,或者反过来,Android会调用Activity的相关生命周期方法,例如`onConfigurationChanged()...

    fragment横竖屏切换demo

    总之,"fragment横竖屏切换demo"项目提供了关于如何在Android中使用Fragment处理屏幕方向变化的实际示例,涉及到了Fragment的生命周期管理、状态保存、布局调整以及与Activity的通信等多个关键知识点。在实际开发中...

    Android Activity横竖屏切换生命周期详解

    关于Activity生命周期和横竖屏切换时,生命周期的执行过程,网上有很多文章。但是都写的很模糊,并且不完善。一般的我们去切换屏幕方向都是不希望Activity被重新创建,这时就需要对一些属性进行设置,或者使用代码...

    android动态创建fragment,横竖屏切换.

    理解Fragment的生命周期、如何在Activity中添加和管理Fragment,以及如何处理横竖屏切换时的状态保存,是每个Android开发者必须掌握的基本技能。在实际项目中,还需要注意性能优化和用户体验,确保应用在各种场景下...

    android 横竖屏切换的处理

    总的来说,处理Android横竖屏切换涉及多方面的知识,包括布局适配、配置变更监听、数据保存恢复、Activity生命周期以及性能优化等。理解并熟练运用这些知识点,能帮助开发者创建出适应不同屏幕方向的高质量应用。

    android 二维码扫描 支持横竖屏切换Demo

    为了实现横竖屏切换,我们需要关注Activity的生命周期管理和布局管理。在Android中,当设备方向改变时,系统会默认重新创建Activity,这可能导致数据丢失和性能问题。因此,我们可以通过在AndroidManifest.xml中对...

    Activity 的生命周期 以及 横屏竖屏切换时 Activity 的状态变化

    ### Activity的生命周期与横竖屏切换时的状态变化 在Android应用开发中,`Activity`作为四大组件之一,是用户交互的主要界面。理解`Activity`的生命周期对于开发流畅且高效的用户体验至关重要。本文将深入探讨`...

    activity横竖屏切换时销毁的处理

    这个过程可能导致数据丢失,用户体验中断,因此开发者需要理解如何正确处理横竖屏切换。 标题中的“activity横竖屏切换时销毁的处理”主要涉及到以下几个关键知识点: 1. **配置变更(Configuration Change)**:...

    Android Activity 横竖屏切换的生命周期

    在Android应用开发中,Activity是用户界面的基本单元,它的生命周期管理是开发者必须深入理解的关键概念。当设备从横屏切换到竖屏,或反之,Activity的生命周期会经历一系列的变化。了解这些变化对于优化用户体验和...

    surfaceview 支持横竖屏切换 视屏适配屏幕

    综上所述,实现SurfaceView支持横竖屏切换、视频适配屏幕以及home退出后继续播放的功能,需要对Android的生命周期管理、布局设计、多媒体播放以及服务有深入的理解。开发者需要处理好SurfaceView的生命周期,确保...

Global site tag (gtag.js) - Google Analytics