StartActivityForResult方法和finish方法的一些理解

1.startActivityForResult方法的使用场景?requestCode和resultCode的含义?

答: 使用场景:用户从一个activity跳转到一个新的activity并从新的activity中获取一些信息。如:跳转图片库选择某个图片做头像,选择联系人,选择收货地址等等。

requestCode用于记录跳转过来的activity做什么(是选择照片还是选择收货地址)该信息会发送到 AMS 那边的 ActivityRecord.requestCode 变量进行记录,Client 端新 Activity 并不知道这个信息。
注意:requestCode >= 0 (至于原因得翻源码 ,我功力不足,所以…)
如果requestCode的值<0,则startActivityForResult方法的效果就类似与startActivity。

resultCode 告诉调用者的一些信息,该信息由被调用 Activity / framework 写入,并经过 AMS 传递给源 Activity。

2.A 启动 B ,B 中何时执行 setResult ? setResult 是否可以位于 finish 之后?

不可以.原因如下:

  public final void setResult(int resultCode, Intent data) {
        synchronized (this) {
            mResultCode = resultCode;
            mResultData = data;
        }
    }

可以看到setResult方法只是进行了赋值操作。再看一下finish方法

可以看出finish方法才是真正的去把值传回去。

3.startActivityForResult 和 singleTask 导致源 Activity 收不到正确结果问题

3.1.基本原则
源 Activity 和目标 Activity 无法在跨 Task 情况下通过 onActivityResult 传递数据

3.2 Android 5.0 以上 AMS 在处理 manifest.xml 文件中的 singleTask 和 singleInstance 信息「不会」创建新的 Task,因此可以收到正常回调

3.3 Android 4.4.4 以下 AMS 在处理 manifest.xml 文件中的 singleTask 和 singleInstance 信息「会」创建新的 Task,因此在 startActivity 之后立即收到取消的回调

上述结果参考刚哥的标准答案以及自己的思考.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值