Intent在Activity中的作用主要是有两个:

1、启动目标Activity

2、传递数据

Intent在传递数据时分两种情况:向下一个Activity传递数据和从下一个Activity返回数据。

一、向下一个Activity传递数据主要是利用Intent作为“信使”来调用,

原Activity需要创建一个intent,并用putExtra(键,值)方法向intent中放入需要传递的信息,然后启动。

public void onClick(View view){
      String msg = "hello,SecondActivity";
      Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
      intent.putExtra("amsg",meg);
      startActivity(intent);
}

那么在目标Activity中则需要对发来的intent进行解析,得到其中的信息,并将其获取。

Intent intent = getIntent();//获取传来的intent对象
String data = intent.getStringExtra("amsg");//获取键值对的键名
Log.d("SecondActivity",data);//在logcat中可以得到显示结果

过程:获取传来的intent——获取其中的信息——显示

二、返回数据给上一个活动

从目标Activity传递到原Activity,存在的问题是可能存在目标与原始一对多的情况,那么就需要“约定的暗号”来进行传递,否则Activity不知道将数据回传给谁。

Android为此提供了一个方法startActivityForResult(intent,requestCode),这个方法要求活动销毁时返回数据到上一个Activity,requestCode用来判断数据的来源,其必须保持唯一性,才可以精确的配对。下面是FirstActivity下点击事件的代码:

@Override
            public void onClick(View view) {
                Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
                startActivityForResult(intent,1);
            }

而在SecondActivity中则需要提供数据相关信息,并设置自身的“辨识码”,用来与上一个Activity进行配对使用:

@Override
            public void onClick(View view) {
                Intent intent = new Intent();
                intent.putExtra("datatrans","来自第二个Activity的数据显示");
                setResult(RESULT_OK,intent);
                finish();
            }

注意到此处的intent只是用来回传数据,而setResult(结果,intent)方法则是专门来向上一个活动返回数据的,结果表示的是处理结果,一般为RESULT_OK或者RESULT_CANCEL两种,而intent则是把数据传递回去。

在第一步的startActivityForResult方法来启动SecondActivity后,当SecondActivity被销毁时,需要回调FirstActivity中的onActivityResult方法,故需要在FirstActivity中重写该方法:

@Override
    public void onActivityResult(int requestCode,int resultCode,Intent data){
        switch (requestCode){
            case 1:
                if(resultCode == RESULT_OK){
                    String data1 = data.getStringExtra("datatrans");
                    Log.d("FirstActivity",data1);
                }
                break;
            case 2:
                if (resultCode == RESULT_CANCELED){
                    String data2 = data.getStringExtra("second");
                    Log.d("FirstActivity2",data2);
                }
                break;
            case 3:
                if (resultCode == RESULT_OK){
                    String data3 = data.getStringExtra("third");
                    Log.d("FirstActivity",data3);
                }
                break;

            default:
        }
    }

上面是自己写的三种情况下的判断,实际上若是只有两个Activity,那么只需要一个case就可以了。可以看出来,要想回传数据成功,需要case中匹配,然后是resultCode也需要匹配成功。

可以这样理解:一封信的寄送与接收,需要信封上的地址与本人的地址(requestCode)一致,而且有时地址一致,但强调姓名(resultCode)也要一致,那么信封才会送到收件人手中。

在SecondActivity被finish()方法销毁后,就会调用onActivityResult方法,先是选择requestCode(即FirstActivity中startActivityForResult中的唯一值),若存在,则根据setResult中的返回状态值与onActivityResult中的比较,若相同,则直接加以显示。

在返回数据到上一个活动中,还没想好怎么来通俗的比喻,下次再补上。

Android学习之Intent传递数据的更多相关文章

  1. Android 消息广播Intent传递数据

    1.创建布局文件activity_broadcast.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk ...

  2. [Android] Android 最全 Intent 传递数据姿势

    我们都是用过 Intent,用它来在组件之间传递数据,所以说 Intent 是组件之间通信的使者,一般情况下,我们传递的都是一些比较简单的数据,并且都是基本的数据类型,写法也比较简单,今天我在这里说的 ...

  3. 【转】Android 之最新最全的Intent传递数据方法

    原文地址:https://www.jianshu.com/p/1169dba99261 intent传递数据 为什么要和intent单独拿出来讲,因为Intent传递数据也是非常重要的 一.简单的传递 ...

  4. Android Intent传递数据

    刚开始看郭大神的<>,实现以下里面的一些例子.Intent传递数据. 我们利用显示的方式进行Intent的启动. 1.启动intent并输入数据. Intent intent=new In ...

  5. Android Activity传递数据使用getIntent()接收不到,揭秘Intent传递数据与Activity启动模式singleTask的关系。

    activity通过intent传递数据的时候,如果activity未启动,那么在这个刚启动的activity里通过getIntent()会获取到这个intent的数据.. 如果要启动的activit ...

  6. Xamarin Android 中Acitvity如何传递数据

    在xamarin android的开发中,activity传递数据非常常见,下面我也来记一下在android中activity之间传递数据的几种方式, Xamarin Android中Activity ...

  7. Android学习之基础知识四-Activity活动4讲(Intent传递数据)

    Intent除了可以开启一个活动,还能在启动活动的时候传递数据,此时Intent相当于一个保存数据的库,我们先把数据保存在Intent中,然后再根据各个activity的需要从其中取出数据.  一.使 ...

  8. Android 开发中使用Intent传递数据的方法

    Activity之间通过Intent传递值,支持基本数据类型和String对象及 它们的数组对象byte.byte[].char.char[].boolean.boolean[].short.shor ...

  9. Android开发经验之—intent传递大数据

    在Activity或者组件之前传递信息时,一般採用intent绑定bundle的方式传值,但在使用过程中须要注意的是不要用bundle传递大容量数据: 在做项目的过程中,须要将听写界面的听写结果信息传 ...

随机推荐

  1. 【CF】328 D. Super M

    这种图论题已经变得简单了... /* D */ #include <iostream> #include <string> #include <map> #incl ...

  2. 近期会放出tlplayer for android的更新版本

    tlplayer for android的一次重大更新在近期将会放出,自从去年初的时候放出tlplayer android版本后,一直都没有更新tlplayer,而tlplayer for windo ...

  3. Bex64

    http://speedupcomputercleaner.com/windows-7-error-bex64.php   How To Fix Windows 7 Error Bex64 ? Wha ...

  4. 轻松搭建自己的Linux发行版本

    许多人想要搭建自己的Linux发行版本,可能是觉得有趣,也可能是为了学习更多的Linux知识,或者因为他们有很正式的问题要解决.但是秘密是:自己搭建完美的发行版本不是很困难的一件事.事实上,我们收集了 ...

  5. Apache虚拟主机(vhost)配置教程

    使用apache来配置虚拟主机,在单一系统上运行多个网站. 现在很多linux主机使用apache作为web服务器的,大部分是基于这个原理来配置虚拟主机的. 下面就windows下以apache 2. ...

  6. 使用Spring MVC 的表单控制器SimpleFormController

    以注册过程为例,我们可能会选择继承AbstractController来实现表单的显示,继承AbstractCommandController来实现表单的处理 ,这样是可行的,但必须要维护两个控制器 ...

  7. Appium 小白从零安装 ,Appium连接真机测试。

    以下是我个人在初次安装使用Appium时的过程,过程中遇到了一些问题,在这里也一一给出解决办法. Appium安装过程 先安装了 Node.js.在node的官网上下载的exe安装文件. 在node的 ...

  8. Mealy和moore型状态机

    Moore型状态机:下一状态只由当前状态决定,即次态=f(现状,输入),输出=f(现状): Mealy型状态机:下一状态不但与当前状态有关,还与当前输入值有关,即次态=f(现状,输入),输出=f(现状 ...

  9. CentOS 6.4 安装 Transmission 2.76

    1.安装Transmission 首先打开Transmission下载页:http://www.transmissionbt.com/download/ ,点击CentOS下载项,会跳转到一个叫&qu ...

  10. mongrel

    Mongrel是一种快速的针对Ruby的Http 服务器,专门为部署发布rails应用而产生的. 可以替代mod_ruby/fastcgi,可以用于生产部属环境. 支持集群,扩展性强. 有各种丰富插件 ...