Activity 切换运行模式后的意外情况
2016-05-18 08:04
274 查看
学习过Android开发的同学一定非常熟悉Activity,这也是四大组件中平时接触最多的东西。关于Activity稍微深入一点就是其不同的启动模式。即standard、singleTop、singleTask 和singleInstance。可以在AndroidManifest.xml 中通过给 标签指定android:launchMode 属性来选择启动模式。现在大部分教程及书籍中都会都其有细致的讲解。
日常开发中,通过合理的设置Activity的启动模式可以避免一些bug的发生。比如在一个APP中,注册页面、登录页面及设置页面所在的activity一般都会设置为singleTask的启动模式,正常情况下,上述页面应该都有且只有一个Activity实例。这样一方面可以节省内存资源,另一方面也可以有效的避免一些非常规操作带来的问题,但是这样也会带来新的问题。
我们用Intent在Activity之间相互传递数据时,必不可少的会使用到startActivityForResult方法及与之对应的onActivityResult方法。
平时使用起来也是屡试不爽。
如上面这段代码所示。如果有一天你心血来潮的把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.**
*/
总得意思就是每次启动该活动时系统首先会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。
而且,也看到了在最后,注释中粗体内容也说到了,如果要从所启动的Activity中获取返回值得时候,不能用这个标志位。因此,onActivityResult方法不能执行也是必然的了。顺便提一下,singleInstance的启动方式也是同样的结果。
至此,应该明白对Activity启动模式的更改还是需要谨慎操作。
日常开发中,通过合理的设置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启动模式的更改还是需要谨慎操作。
相关文章推荐
- jfinal 报异常:java.lang.NoSuchMethodError: javax.servlet.ServletContext.getJspConfigDescriptor
- BZOJ1833 [ZJOI2010]count 数字计数
- Stirling数
- BZOJ2809——[Apio2012]dispatching
- C# 笔记——排序
- sed of shell
- solr多集合配置
- solr多集合配置
- python 迭代器为什么无法第二次打印元素?
- repo讲解
- POJ 1185 炮兵阵地(状态压缩DP)
- 程序的链接的三种方式
- 2016-HNUST校赛-addition
- 从一个表格文件中录入信息,进行计算后,在文件中输出这个表格
- mac下docker使用笔记
- 史上最清晰的红黑树讲解(上)
- 求一个字符串的最小正周期
- Catalan数
- Android Intent最全面的解析
- springmvc配置文件