android横竖屏切换生命周期

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

仔细阅读代码后发现,确实是应用内有一处代码使得应用在锁屏后自动结束了。该处代码是在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的机制不是很了解会找很久,我就掉进了这个坑里,希望看到我这边文章的你不要走我的老路。

最后感谢大家的支持,我会继续更新我的博客的,希望大家多多支持我!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值