您的位置:首页 > 移动开发 > Android开发

android横竖屏切换生命周期

2015-04-27 13:31 260 查看
前段时间在做项目的时候发现一个很奇怪的现象,在应用中按下锁屏键后再解锁,发现应用自动结束了。一开始以为是占用内存太多系统结束了应用,后来感觉这个很影响用户体验,决定自己查一下这个问题的根源。

仔细阅读代码后发现,确实是应用内有一处代码使得应用在锁屏后自动结束了。该处代码是在onCreate中通过keyguardmanager判断设备是不是处于锁屏状态,如果是锁屏状态则结束应用。打印日志后发现,每次解锁的时候都会重新onCreate一次,这个使我很不解,为什么每次解锁的时候都会重新走一遍activity的生命周期。这个问题困扰了我两天的时间没有想明,后来偶然间想到可能是横竖屏切换导致了该问题。由于我是做游戏的,且游戏是横屏的,锁屏后手机默认回到了竖屏的状态,当解锁后需要横屏一次,这个时候Android 3.2以上的版本会默认走一边activity的所有生命周期,就是由于这个原因导致了activity的重新创建,进而导致了调用onCreate里面的结束应用的代码,最终导致了解锁后应用被杀死的情况。

原因是找到了,这样子的用户体验是非常差的,所有需要寻找解决方案。在我所知道的知识范围内我无法解决,只好通过google,百度,stackoverflow上寻找答案。最后基本的解决方法就是在android:configChanges里设置”orientation|screenSize”,确保activity横竖屏切换时不调用onCreate函数。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.portorland"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />

<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >

<!--
可以通过以下两个属性指定该Activity是横屏或竖屏显示
竖屏  android:screenOrientation="portrait"
横屏  android:screenOrientation="landscape"
自从Android 3.2(API 13),screen size也开始跟着设备的横竖切换而改变
如果你想阻止程序在运行时重新加载Activity,除了设置"orientation",你还必须设置"ScreenSize"。
解决方法:
AndroidManifest.xml中设置android:configChanges="orientation|screenSize“
-->
<activity
android:name="com.example.portorland.MainActivity"
android:configChanges="orientation|screenSize"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

<!-- <uses-permission android:name="android.permission.CHANGE_CONFIGURATION" >
</uses-permission> -->

</manifest>


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

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>


这次解决的这个问题,看似简单,如果对android的机制不是很了解会找很久,我就掉进了这个坑里,希望看到我这边文章的你不要走我的老路。

最后感谢大家的支持,我会继续更新我的博客的,希望大家多多支持我!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息