`
imagiczhang
  • 浏览: 1751 次
  • 性别: 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 studio中 activity的当前页横竖屏切换、跳转页面后横竖屏切换以及生命周期的调用

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

    1、新建一个Activity,并把各个生命周期打印出来 2、运行Activity,得到如下信息 onCreate–&gt; onStart–&gt; onResume–&gt; 3、按crtl+f12切换成横屏时 onSaveInstanceState–&gt; onPause–&gt; onStop–&gt; onDestroy–&gt; ...

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

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

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

    Activity 横竖屏切换时需要回调两个函数 ,所以在此将这个两个函数暂时看成是Activity 横竖屏切换的生命周期的一部分,这两个函数如下 onSaveInstanceState(Bundle outState) :Activity 即将销毁时保存数据 ...

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

    一、简介 二、代码 /activityLifeCycle_3Screen/AndroidManifest.xml &lt;manifest xmlns:android=http://schemas.android.com/apk/res/android ... android:versionCode=1 ... android:targetSdkVersio

    解决Android手机屏幕横竖屏切换

    Android中当屏幕横竖屏切换时,Activity的生命周期是重新加载(说明当前的Activity给销毁了,但又重新执行加载), 怎么使屏幕横竖屏切换时,当前的Activity不销毁呢? 1. 在AndroidManifest.xml中为Activity设置...

    android 学习笔记7-页面跳转 Activity启动 生命周期 activity数据传递

    1、创建一个自己的Activity 2、启动activity-显示启动和隐式启动: 3、隐式启动自己的activity 4、获取隐启动传递过来的data数据 ...6、禁用掉横竖屏切换 7、开启activity获取返回值-startActivityForResult:

    android经典开发案例60个(源码类).rar_Activity切换_android_android 横竖屏_android

    android经典开发案例60个(源码类)例:Activity生命周期、横竖屏切换处理等

    Android中的Activity生命周期总结

    主要介绍了Android中的Activity生命周期总结,本文讲解了Activity四大基本状态、Activity七大生命周期函数、切换横竖屏触发的生命周期事件等内容,需要的朋友可以参考下

    android 开发技巧合集

    2.1.11、横竖屏切换不销毁当前Activity 23 2.2、INTENT RECEIVER 25 2.3、SERVICE 26 2.3.1、什么是Service 26 2.3.2、如何使用Service 27 2.3.3、Service的生命周期 32 2.3.4、判断服务开启状态 33 2.3.5、获取启动...

    Android面试题21

    2. 两个Activity之间跳转时必然会执行的是哪几个方法 3. 横竖屏切换时候Activity的生命周期 5. 两个Activity之间怎么传递数据 6.

    Android面试宝典完整版

    6. 横竖屏切换时 Activity 的生命周期. 9 7. 如何将一个 Activity 设置成窗口的样式. 10 8. 如何退出 Activity?如何安全退出已调用多个 Activity 的 Application?. 10 二、 Service. 11 1、Service 是否在 main ...

    Android相机 解决三星bug版本

    (2) 三星的camera强制切换到横屏 导致Activity重启生命周期 (但是部分机型 配置 android:configChanges 也不能阻止横竖屏切换); 我的解决方法为 如果 activity 的销毁如果无法避免 那么在activity销毁之前调用 ...

    LifeCycleDemo

    Activity生命周期及横竖屏切换影响生命周期,代码示例实现。

    swipeback-Android侧滑返回分析和实现(不高仿微信).zip

    Tips.6如需动态支持横竖屏切换(比如APP中有“支持横屏”开关),屏幕方向需指定为behind跟随栈底Activity方向,同时在onCreate中进行判断,若不支持横竖屏切换则锁定屏幕方向(因为经测试SDK21中behind无效)。

    60个Android开发精典案例 Android软件源码.zip

    2-1(Activity生命周期) 3-1(Button与点击监听器) 3-10-1(列表之ArrayAdapter适配) 3-10-2(列表之SimpleAdapter适配) 3-11(Dialog对话框) 3-12-5(Activity跳转与操作) 3-12-6(横竖屏切换处理) 3-3(ImageButton图片...

    BiliBili-基于ijkplayer rxjava retrofit,组件化思想,实现一个仿B站的Android客户端.zip

     android:name="android.permission.READ_EXTERNAL_STORAGE"/&gt;注意,如果横竖屏切换不想重新走一遍生命周期,还需要在表单中设置Activity的configChanges属性:&lt;activity android:name=".PlayActivity"  android:...

Global site tag (gtag.js) - Google Analytics