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中的比较,若相同,则直接加以显示。

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

最新文章

  1. 《学技术练英语》PPT分享
  2. phpstorm常用功能&快捷键(mac)
  3. angular 自定义指令 directive transclude 理解
  4. AI方向
  5. [Word]中批量修改图片大小和缩放比例方法
  6. 使用FWTools来导入shp数据到mysql
  7. lamp环境搭建(ubuntu)
  8. Linux phpwind论坛的安装
  9. myeclipse的快捷键和myeclipse快捷键设置
  10. Codeforces Round #367 (Div. 2) A. Beru-taxi (水题)
  11. Sponsored Feature: Common Performance Issues in Game Programming
  12. CHM类型API文件打不开问题解决方法
  13. static关键字的用法和main函数
  14. android面试题之一
  15. 银联+移动+三星PK微信、余额宝
  16. CodeForces 609A USB Flash Drives
  17. .Net Core的一些个人总结
  18. 使用 vscode将本地项目上传到github以及删除github上的某个文件夹
  19. process.argv
  20. vue 通过自定义指令实现 置顶操作;

热门文章

  1. How to: Host and Run a Basic Windows Communication Foundation Service
  2. 小图用 imageNamed: 大图用 dataWithContentsOfFile:options
  3. opencv保存选择图像中的区域(二)
  4. [CODEVS1116]四色问题
  5. 【JS】Intermediate4:JSON
  6. 链表反转C实现(递归与循环)
  7. Codeforces Round #343 (Div. 2) A. Far Relative’s Birthday Cake
  8. [置顶] 斗地主算法的设计与实现--项目介绍&如何定义和构造一张牌
  9. java 泛型中 T、E ... 和 问号(通配符)的区别
  10. 理解C++中函数的返回