Activity 切换运行模式后的意外情况

学习过Android开发的同学一定非常熟悉Activity,这也是四大组件中平时接触最多的东西。关于Activity稍微深入一点就是其不同的启动模式。即standard、singleTop、singleTask 和singleInstance。可以在AndroidManifest.xml 中通过给 标签指定
android:launchMode 属性来选择启动模式。现在大部分教程及书籍中都会都其有细致的讲解。

日常开发中,通过合理的设置Activity的启动模式可以避免一些bug的发生。比如在一个APP中,注册页面、登录页面及设置页面所在的activity一般都会设置为singleTask的启动模式,正常情况下,上述页面应该都有且只有一个Activity实例。这样一方面可以节省内存资源,另一方面也可以有效的避免一些非常规操作带来的问题,但是这样也会带来新的问题。

我们用Intent在Activity之间相互传递数据时,必不可少的会使用到startActivityForResult方法及与之对应的onActivityResult方法。
平时使用起来也是屡试不爽。

Intent intent = new Intent(MainActivity.this, SecondActivity.class);
            startActivityForResult(intent, 0);

如上面这段代码所示。如果有一天你心血来潮的把SecondActivity的启动模式修改为singleTask,结果意外发现onActivityResult居然不执行了。我们在看一下Android API 中的的注释(截取部分内容)

/***
*

When using this flag, if a task is already running for the activity
* you are now starting, then a new activity will not be started; instead,
* the current task will simply be brought to the front of the screen with
* the state it was last in. See {@link #FLAG_ACTIVITY_MULTIPLE_TASK} for a flag
* to disable this behavior.
*
*

This flag can not be used when the caller is requesting a result from
* the activity being launched.

*/

 `public static final int FLAG_ACTIVITY_NEW_TASK = 0x10000000;`

总得意思就是每次启动该活动时系统首先会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。

而且,也看到了在最后,注释中粗体内容也说到了,如果要从所启动的Activity中获取返回值得时候,不能用这个标志位。因此,onActivityResult方法不能执行也是必然的了。顺便提一下,singleInstance的启动方式也是同样的结果。

至此,应该明白对Activity启动模式的更改还是需要谨慎操作。

你可能感兴趣的:(Activity 切换运行模式后的意外情况)