startActivityForResult中回调setResult注意事项.以及Task认识

本文探讨了在Android开发中使用startActivityForResult进行页面间数据传递时的注意事项,强调了请求码应大于等于0,并指出setResult()应在finish()前调用。在Android不同版本上可能存在行为差异,一种解决方法是使用广播。同时,文章讲解了Activity的四种启动模式:standard、singleTop、singleTask和singleInstance,并通过实例展示了如何通过Intent.FLAG_ACTIVITY_NEW_TASK影响Activity的Task归属。
摘要由CSDN通过智能技术生成

一:

1.startActivityForResult的请求码要大于等于0

2.activity返回result是在被finish的时候,也就是说调用setResult()方法必须在finish()之前
那么如果在如下方法中调用setResult()也有可能不会返回成功: onPause(), onStop(), onDestroy(),
因为这些方法调用不一定是在finish之前的,当然在onCreate()就调用setResult肯定是在finish之前的。

在APP开发中,为了在页面之间传递对象(这里强调回传),我们通常使用startActivityForResult。如果ActivityA要跳转到ActivityB,但是ActivityB的启动模式为singleTop,方法调用就会存在一些“异样”。在Android4.4,ActivityA调用startActivityForResult后,ActivityB会立即执行;but在安卓5.0上,就不存在该问题。探究了一种该问题的解决方法,使用广播。这里就要注意了要在onCreate&&onDestory中进行注册和注销,否则接收不到信息哦!

3. setResult()界面 不能设置其他启动模式 ,否则可能会报错

二:启动模式

Activity有四种加载模式:standard(默认), singleTop, singleTask和 singleInstance。

Task 栈
1.  Standard  默认加载模式   ,创建时
不管栈中是否已经创建Activity实例,每次启动都会创建新的Acitivty实例
android:launchMode="standard" 
如:现在栈的情况为: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将会依次弹出栈而显示在界面上。
2.SingleTop 栈顶单实例创建时
a.栈中没有创建Activtiy实例,就创建一个新的Activity实例
b.如果该Activtiy实例处于栈顶,就不会创建新的Activtiy实例
c.如果处于栈中,启动就会创建新的Activtiy实例
 android:launchMode="SingleTop "
例如:现在栈的情况为: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。
3.SingleTask栈中单实例,创建时
a.栈中没有创建该Activtiy实例,就创建一个新的Activity实例
b.如果该Activtiy实例处于栈顶,启动不会创建新的Activtiy实例
c.处于栈中,销毁该Acitvity之上的其他实例,本身不会创建新的实例
 android:launchMode="SingleTask"
例如:现在栈的情况为:A B C D。B的Launch mode为singleTask,此时D通过Intent跳转到B,则栈的情况变成了:A B。而C和D被弹出销毁了,也就是说位于B之上的实例都被销毁了。
情况二:
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值