Android startActivityForResult用法

Android startActivityForResult用法一、介绍当我们在第一个Activity打开第二个Activity时,第二个Activity关闭并想返回数据给第一个Activity时,我们就可以使用startActivityForResult进行传值。用到的几个方法介绍:1.startActivityForResult(Intentintent,intrequestCode)requestCode:如果>=…

大家好,又见面了,我是你们的朋友全栈君。

一、介绍

当我们在第一个Activity打开第二个Activity时,第二个Activity关闭并想返回数据给第一个Activity时,我们就可以使用startActivityForResult进行传值。

用到的几个方法介绍:

1. startActivityForResult(Intent intent, int requestCode)

    requestCode:如果> = 0,当Activity结束时requestCode将归还在onActivityResult()中。以便确定返回的数据是从哪个Activity中返回,用来标识目标activity。

2. onActivityResult(int requestCode, int resultCode, Intent data)

    requestCode:用于与startActivityForResult中的requestCode中值进行比较判断,是以便确认返回的数据是从哪个Activity返回的。

    resultCode:是由子Activity通过其setResult()方法返回。适用于多个activity都返回数据时,来标识到底是哪一个activity返回的值。

   上面两个值感觉Android就是为了保证数据的严格一致性特地设置了两把锁,来保证数据的发送,目的地的严格一致性。

3. setResult(int resultCode, Intent data)

    resultCode:当Activity结束时resultCode将归还在onActivityResult()中,一般为RESULT_CANCELED , RESULT_OK该值默认为-1。

二、示例

1、使用系统提供的startActivityForResult(Intent intent, int requestCode)方法打开新的Activity,为了得到传回的数据,必须在Activity中重写onActivityResult(int requestCode, int resultCode, Intent data)方法用来接收返回数据:

public class MainActivity extends Activity {
    private final static String TAG="MainActivity";
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        Button btnOpen=(Button)this.findViewById(R.id.btnOpen);
        btnOpen.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v) {
                
                //第二个参数为请求码,可以根据业务需求自己编号
                startActivityForResult(new Intent(MainActivity.this, OtherActivity.class), 1);
            }
        });
    }
    
    /**
     * 为了得到传回的数据,必须在前面的Activity中(指MainActivity类)重写onActivityResult方法
     * 
     * requestCode 请求码,即调用startActivityForResult()传递过去的值
     * resultCode 结果码,结果码用于标识返回数据来自哪个新Activity
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        String result = data.getExtras().getString("result");//得到新Activity 关闭后返回的数据
        Log.i(TAG, result);
    }
}

2、使用startActivityForResult(Intent intent, int requestCode)方法打开新的Activity,新Activity关闭前需要向前面的Activity返回数据需要使用系统提供的setResult(int resultCode, Intent data)方法实现:

public class OtherActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.other);

        Button btnClose=(Button)findViewById(R.id.btnClose);
        btnClose.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v) {
                //数据是使用Intent返回
                Intent intent = new Intent();
                //把返回数据存入Intent
                intent.putExtra("result", "My name is linjiqin");
                //设置返回数据
                OtherActivity.this.setResult(RESULT_OK, intent);
                //关闭Activity
                OtherActivity.this.finish();
            }
        });
        
    }

}

点击返回button需要在onClick里面实现/直接按Back键返回,需要重写onBackPressed方法

setResult()方法的第一个参数值可以根据业务需要自己定义,上面代码中使用到的RESULT_OK是系统Activity类定义的一个常量,值为-1,代码片断如下:
public class android.app.Activity extends ……{

  public static final int RESULT_CANCELED = 0;
  public static final int RESULT_OK = -1;
  public static final int RESULT_FIRST_USER = 1;
}

其实使用startActivityForResult跳转到另一个Activity后,Activity在其finish()动作或者back动作后,会回调主Activity的onActivityResult()方法。我们只需重写onActivityResult(int requestCode, int resultCode, Intent data)方法,根据请求码和返回码进行判断,然后进行相应的处理。这里需要注意一点,Activity在使用手机返回键返回主Activity时,返回码是RESULT_CANCELED = 0。我们一般使用setResult(RESULT_OK, intent);将我们的返回码设置为RESULT_OK = -1,这样可以避免无用的判断

注意:在Fragment中使用startActivityForResult的时候,不要使用getActivity().startActivityForResult,而是应该直接使startActivityForResult()。
参考文章 startActivityForResult的使用

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/157238.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • cap理论P(分区容错)的理解

    cap理论P(分区容错)的理解一个分布式系统里面,节点组成的网络本来应该是连通的。然而可能因为一些故障,使得有些节点之间不连通了,整个网络就分成了几块区域。数据就散布在了这些不连通的区域中。这就叫分区。当你一个数据项只在一个节点中保存,那么分区出现后,和这个节点不连通的部分就访问不到这个数据了。这时分区就是无法容忍的。提高分区容忍性的办法就是一个数据项复制到多个节点上,那么出现分区之后,这一数据项就可能分布到各个区里。容忍性就提高了。然而,要把数据复制到多个节点,就会带来一致性的问题,就是多个节点上面的数据可能是不一致的。要保证一

    2022年7月25日
  • 本草纲目pdf彩图版下载_本草纲目彩色图谱下载|本草纲目彩色图集(精编珍藏版) PDF电子版 – 天天游戏吧…

    本草纲目pdf彩图版下载_本草纲目彩色图谱下载|本草纲目彩色图集(精编珍藏版) PDF电子版 – 天天游戏吧…本草纲目彩色图集以诸种版本中最完整的金陵本为蓝本,严格选择最常见、最实用的药物加以介绍,从实用角度讲解,并配以彩色图谱,避免使用艰涩难懂的文言文,而是把它译为通俗易懂的现代文,所选取的多是在生活中较为常见,贴近生活、实用性强的内容,是生活中必备的浓缩精华读本,不仅是医务工作者专业学习参考的医书,更是人们生活中必备的自我保健、自我医疗的家用手册。内容简介《本草纲目》是我国古代医学宝库中珍贵的科学遗产…

    2022年7月15日
  • 电容的基础知识

    常用电容按介质区分有纸介电容、油浸纸介电容、金属化纸介电容、云母电容、薄膜电容、陶瓷电容、电解电容等。表1 常用电容的结构和特点电容种类电 容 结 构&#

    2021年12月26日
  • 前端vue定时器_vue切换页面清除所有定时器

    前端vue定时器_vue切换页面清除所有定时器vue页面定时器的两种方式

    2022年10月25日
  • 小程序文本内容无法长按复制粘贴_小程序读取剪贴板怎么办

    小程序文本内容无法长按复制粘贴_小程序读取剪贴板怎么办微信小程序的文本,要具有长按复制功能,必须满足两个条件:文本在<text>标签内;<text>标签要有selectable属性。例如:<textselectable=’true’>文本</text>下面一个例子是,解决WxParse不能长按选择的问题。在wxParse.wxml中修改:diff-…

    2022年9月29日
  • phpstorm 2022.01.21激活【最新永久激活】[通俗易懂]

    (phpstorm 2022.01.21激活)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年3月30日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号