对于·app多个界面管理,如果一般使用Activity默认的加载模式,按返回键就会退回上一次操作,就是一种新建一个Activity实例。时间长了就会变得卡顿,一般人会选择手动地在代码中屏蔽返回键,使用app中开发的返回键,这样也可以解决问题。
但是本质问题还是没解决,不可能以后开发也用这样的方法,用多了也烦躁。所以解决这个问题的关键在于了解Activity的加载模式。
第一中加载模式是:standard标准模式,系统默认的加载的模式
android:launchMode=“standard”
这种模式是系统的默认模式,一般开发app不需要更改。只要不安手机上的物理按键返回键back键。
这种加载模式的原理是开启app第一个界面时,为app创建一个Task来管理app的开启的Activity,每次操作都会创建一个新的实例Activty,同时也包括返回。所以如果你按手机上的物理按键back键后,会依次返回你之前的操作,知道app的第一个实例化得Activty。如果在app中操作太多,创建的Activity实例也会变得很多,如果大量操作的话,会出现卡顿的现象,也有可能出现内存溢出导致手机应用程序挂掉。
第二种加载模式是:singleTop模式
这种模式与standard标准模式相似,但不同的是这种模式如果开启的Activty位于栈顶的话,就不会重新实例化Activty,不管操作多少次都不会改变界面上的程序体验。
如果在任务栈顶没有要开启的Activty的话,就会创建新的Actvity加载到栈顶——此时与与standard标准模式完全相同。
第三种加载模式是:singleTask模式
这种加载模式在一个任务栈Task中只有一个Activty,不会重复地创建任务栈里有的Activty实例的。这种模式有三类情况
(1)如果将要启动的目标Activity没有在任务栈中且不位于栈顶的话,就会重新实例化Activty加载到栈顶。
(2)如果将要启动的目标Activity位于栈顶的话,此时与singleTop模式加载模式一样
(3)如果将要启动的目标Activity存在任务栈,但是又不在栈顶的话,系统会将任务栈内处于目标以上的所有Activty都一处,直到目标Activty暴露在栈顶。
第四种加载模式;singleInstance模式:
在这种加载模式下,不管目标Activity位于哪个Task任务栈,只会创建一个实例Activity。这种模式分为俩种情况:
(1)如果将要启动的目标Activty不存在,系统会创建一个全新的任务栈Activty再创建目标Activty实例,并将其加入栈顶。
(2)如果将要启动的实例Activity存在,无论它位于哪个应用程序中,位于哪个任务栈Task,系统都会将目标实例Activity转到前台,就是栈顶,从而使该目标Activity显示出来
注意:采用singleInstance模式加载Activity总是位于栈顶,且采用singleInstance模式加载的Activity所在Task将只包含该Activity
回到之前的所说的问题,屏蔽物理按键显然不是个好方法。所以折中的办法是将Activity的加载模式稍微改一下。将加载模式标准的standard模式改为singleTask模式,此时前面的问题迎刃而解。物理按键和app返回操作都有效,而且也不会出现大量操作卡顿的现象。看似问题解决了,但是有一个问题就来了,也就是标题的问题,使用带返回值的intent操作不管怎么弄返回的数据都为空,而且app会出现典型的问题应用程序无响应。
通过Android的Activity加载模式可以看到,singleTask模式加载Activity实例,当任务栈的目标Activity实例不在栈顶时,系统会移除目标上面的所有Activity实例,从而是目标转为前台,但是之前的栈顶的要返回的Activity以及不存在了,返回到第一张界面找不到第二张界面返回的数据,所以返回数据为空,而且onActivityResult()中的数据捕获异常,导致程序挂掉,至此问题找到了,所以可以把第二张界面的加载模式设为singleTop模式。至此,问题解决了。但是,仔细想一下,如果再次按返回键的话,应该也会将第二张界面重复地实例化多次,不过按返回键不会出现标准模式下的操作返回模式。只不过第二张界面在应用程序不退出的情况下,仍然会重复地新建第二张界面,不过不会影响返回键操作。所以这点小小瑕疵还是能够允许的。到此为止,一路上的问题都解决了。