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启动模式的更改还是需要谨慎操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阎楠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值