startactivityforresult的使用,和singleTask不能使用的问题

一、基本用法

使用startActivityForResult开启页面的时候,当目标页面关闭的时候,可以回传数据给启动页面,比如ActivityA 使用startActivityForResult 启动ActivityB 则ActivityB关闭的时候,可以返回结果给ActivityA
其中 启动页面ActivityA用到的函数有:
startActivityForResult(intent, requestCode)//启动页面
onActivityResult(int requestCode, int resultCode, Intent data)//接收返回结果

目标页面ActivityB用到的函数有:
setResult(int resultCode, Intent data)//设置要回传的数据

举例:
启动页面 ActivityA的代码
1.打开页面的代码

Intent mIntent=new Intent(ActivityA.this,ActivityB.class);
startActivityForResult(mIntent,10086);
//100086为请求码,可以自己定义,但一定要  >= 0 ,查看源码可以发现,
//对请求码有>= 0的判断

2、接收结果的代码,重写
onActivityResult方法,接收返回结果。

 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Log.e("StartActivity", "请求码:" + requestCode);
        Log.e("StartActivity", "结果码码:"+resultCode);
        if(data!=null) 
        Log.e("StartActivity","返回的数据:"

        else Log.e("StartActivity", "返回的结果是空");
    }

目标页面ActivityB的代码,关闭前,执行setResult,然后finish页面

Intent intent=new Intent();
intent.putExtra("back_result","这是返回的结果");
setResult(1001,intent);//1001是自己定义的返回结果码,尽量避开0
finish();

简单来说,启动的时候使用startActivityForResult,重写onActivityResult
关闭目标页面前即 finish前设置返回结果setResult

二、请求码和返回码

onActivityResult中既可以看到请求码,也可以看到结果码。

请求码的作用:一个页面可以有多个button打开多个页面,为了区分这些请求,可以使用不同的请求码来区分,onActivityResult中使用switch进行判断

结果码的作用,被开启的页面,可以有不同的返回结果。可以使用结果码进行区分。还有一点,如果没有执行setResult ,直接进行finish,则返回码是0,onActivityResult的Intent data返回是null

应用举例:
上传图片的时候,选择拍照上传,如果只使用请求码requestCode判断返回结果,那么就区分不出来用户是真正拍了一张照片并选择返回,还是直接点击返回按钮进行了取消。所以,请求码和返回码要配合使用来判断结果

三、被开启的页面启动模式为singleTask的问题

ActivityA 使用startActivityForResult 启动ActivityB,而ActivityB的启动模式是 android:launchMode=”singleTask”
那么ActivityA 执行startActivityForResult的时候,会直接执行ActivityA 的onActivityResult,并不是在ActivityB设置结果关闭页面的时候执行。
从源码里面没有找到执行顺序,但是从逻辑上可以解释。

假如有A,B,C,D四个页面,其中B是singleTask的模式。
进行这样的操作
1、 A startActivity B
2、B startActivity C
3、C startActivity D
4、D startActivityForResult B

这样在第三步的时候,任务栈里面的Activity 顺序是A,B,C,D —-D在栈顶
最后一步 D开启B的时候使用 startActivityForResult。
singleTask模式的特点是会关闭任务栈里,在它之前的Activity
这样,B被开启的时候,任务栈里就剩A、B了,D已经被销毁了,所以,B的结果没有地方返回。

为了防止这样的局面出现,开启singleTask的页面的时候,直接执行了onActivityResult,返回码是取消码0。
这里写图片描述

第四步 D startActivityForResult B时候log如下:
ActivityD: 请求码:10086
ActivityD: 结果码码:0
ActivityD: 返回的结果是空
ActivityC: C onDestroy
ActivityB: B onNewIntent
ActivityB: B onRestart
ActivityB: B onStart
ActivityB: B onResume
ActivityD: D onDestroy

猜你喜欢

转载自blog.csdn.net/kangyouv/article/details/76098023