使用过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 activity 执行屏幕横竖屏切换的时候activity声明周期执行的竖屏的时候点击横屏 09-04 15:54:27.675: I/yxd(6708): 应用程序执行了============onPause===方法===>> 09-04 15:54:27.685: I/yxd(6708): 应用...
android studio中 activity的当前页横竖屏切换、跳转页面后横竖屏切换以及生命周期的调用
1、新建一个Activity,并把各个生命周期打印出来 2、运行Activity,得到如下信息 onCreate–> onStart–> onResume–> 3、按crtl+f12切换成横屏时 onSaveInstanceState–> onPause–> onStop–> onDestroy–> ...
关于Activity生命周期和横竖屏切换时,生命周期的执行过程,网上有很多文章。但是都写的很模糊,并且不完善。一般的我们去切换屏幕方向都是不希望Activity被重新创建,这时就需要对一些属性进行设置,或者使用代码...
Activity 横竖屏切换时需要回调两个函数 ,所以在此将这个两个函数暂时看成是Activity 横竖屏切换的生命周期的一部分,这两个函数如下 onSaveInstanceState(Bundle outState) :Activity 即将销毁时保存数据 ...
一、简介 二、代码 /activityLifeCycle_3Screen/AndroidManifest.xml <manifest xmlns:android=http://schemas.android.com/apk/res/android ... android:versionCode=1 ... android:targetSdkVersio
Android中当屏幕横竖屏切换时,Activity的生命周期是重新加载(说明当前的Activity给销毁了,但又重新执行加载), 怎么使屏幕横竖屏切换时,当前的Activity不销毁呢? 1. 在AndroidManifest.xml中为Activity设置...
1、创建一个自己的Activity 2、启动activity-显示启动和隐式启动: 3、隐式启动自己的activity 4、获取隐启动传递过来的data数据 ...6、禁用掉横竖屏切换 7、开启activity获取返回值-startActivityForResult:
android经典开发案例60个(源码类)例:Activity生命周期、横竖屏切换处理等
主要介绍了Android中的Activity生命周期总结,本文讲解了Activity四大基本状态、Activity七大生命周期函数、切换横竖屏触发的生命周期事件等内容,需要的朋友可以参考下
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、获取启动...
2. 两个Activity之间跳转时必然会执行的是哪几个方法 3. 横竖屏切换时候Activity的生命周期 5. 两个Activity之间怎么传递数据 6.
6. 横竖屏切换时 Activity 的生命周期. 9 7. 如何将一个 Activity 设置成窗口的样式. 10 8. 如何退出 Activity?如何安全退出已调用多个 Activity 的 Application?. 10 二、 Service. 11 1、Service 是否在 main ...
(2) 三星的camera强制切换到横屏 导致Activity重启生命周期 (但是部分机型 配置 android:configChanges 也不能阻止横竖屏切换); 我的解决方法为 如果 activity 的销毁如果无法避免 那么在activity销毁之前调用 ...
Activity生命周期及横竖屏切换影响生命周期,代码示例实现。
Tips.6如需动态支持横竖屏切换(比如APP中有“支持横屏”开关),屏幕方向需指定为behind跟随栈底Activity方向,同时在onCreate中进行判断,若不支持横竖屏切换则锁定屏幕方向(因为经测试SDK21中behind无效)。
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图片...
android:name="android.permission.READ_EXTERNAL_STORAGE"/>注意,如果横竖屏切换不想重新走一遍生命周期,还需要在表单中设置Activity的configChanges属性:<activity android:name=".PlayActivity" android:...