Android学习记录(8)—Activity的四种加载模式及有关Activity横竖屏切换的问题

Activity有四种加载模式:standard(默认), singleTop, singleTask和 singleInstance。以下逐一举例说明他们的区别:

standard:Activity的默认加载方法,即使某个Activity在Task栈中已经存在,另一个activity通过Intent跳转到该activity,同样会新创建一个实例压入栈中。例如:现在栈的情况为:A B C D,在D这个Activity中通过Intent跳转到D,那么现在的栈情况为: A B C D D 。此时如果栈顶的D通过Intent跳转到B,则栈情况为:A B C D D B。此时如果依次按返回键,D  D C B A将会依次弹出栈而显示在界面上。


singleTop:如果某个Activity的Launch mode设置成singleTop,那么当该Activity位于栈顶的时候,再通过Intent跳转到本身这个Activity,则将不会创建一个新的实例压入栈中。例如:现在栈的情况为:A B C D。D的Launch mode设置成了singleTop,那么在D中启动Intent跳转到D,那么将不会新创建一个D的实例压入栈中,此时栈的情况依然为:A B C D。但是如果此时B的模式也是singleTop,D跳转到B,那么则会新建一个B的实例压入栈中,因为此时B不是位于栈顶,此时栈的情况就变成了:A B C D B。


singleTask:如果某个Activity是singleTask模式,那么Task栈中将会只有一个该Activity的实例。例如:现在栈的情况为:A B C D。B的Launch mode为singleTask,

此时D通过Intent跳转到B,则栈的情况变成了:A B。而C和D被弹出销毁了,也就是说位于B之上的实例都被销毁了。


singleInstance:将Activity压入一个新建的任务栈中。例如:Task栈1的情况为:A B C。C通过Intent跳转到D,而D的Launch mode为singleInstance,则将会新建一

个Task栈2。此时Task栈1的情况还是为:A B C。Task栈2的情况为:D。此时屏幕界面显示D的内容,如果这时D又通过Intent跳转到D,则Task栈2中也不会新建一个D的实例,所以两个栈的情况也不会变化。而如果D跳转到C,则栈1的情况变成了:A B C C,因为C的Launch mode为standard,此时如果再按返回键,则栈1变成:A B C。也就是说现在界面还显示C的内容,不是D。


有关横屏和竖屏切换时,Activity生命周期的变化引起的错误的解决办法:

首先是要知道,如果在没有任何配置的情况下即默认情况下,由竖屏切换到横屏时又重新创建了一次Activity,即生命周期的执行顺序是:onPause()->onStop()->onDestroy()->onCreate()->onStart()->onResume(),但是从横屏切换到竖屏时,是重新创建了两次Activity,即生命周期的执行顺序是:onPause()->onStop()->onDestroy()->onCreate()->onStart()->onResume()->onPause()->onStop()->onDestroy()->onCreate()->onStart()->onResume(),所以很显然,横竖屏切换时出现的错误和bug肯定是由于生命周期的变化而引起的,那怎样才能使横竖屏切换时,这些生命周期不变化,Activity不会被重新创建呢?方法如下:

在清单文件中的Activity的配置中添加以下代码即可:android:configChanges="orientation|keyboardHidden|screenSize"
解释一下:keyboardHidden隐藏键盘的目的就是有时候键盘的显示与关闭的变化影响Activity的生命周期。特别注意的是:screenSize,它是跟屏幕的适配有关的,在

低版本中可以不设置这个参数,但是在4.0以后,为了防止横竖屏切换时,生命周期的变化,必须加上这个参数。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="net.loonggg.configchange"
    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:name="net.loonggg.configchange.MainActivity"
            android:configChanges="orientation|keyboardHidden|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>

</manifest>

原文地址:https://www.cnblogs.com/loonggg/p/4981819.html