美文网首页四大组件
Activity跳转(有返回数据跳转)以及传递参数和回传参数

Activity跳转(有返回数据跳转)以及传递参数和回传参数

作者: 规诫 | 来源:发表于2019-07-25 08:02 被阅读2次

    使用Bundle在Activity之间传递数据

    • Bundle类是一个key-value对,是一个final类
    • 两个Activity之间通信可以用Bundle类实现步骤:
    1. 新建一个Bundle类
      Bundle bundle=new Bundle();
    2. bundle类中加入数据(key-value的形式)
      bundle.putString("data", "张三");
    3. 新建一个Intent对象,并将该Bundle加入该Intent对象
      Intent intent=new Intent();
      intent.setClass(TestBundle.this, Target.class);
      intent.putExtras(bundle);
    4. 启动Intent
      startActivity(intent);
    5. 第二个Activity接收传递过来的数据
      Intent intent=getIntent();
      Bundle bundle =intent.getExtras();
      String data = bundle.getString("data");//读出数据
    • 传递的数据类型
      简单或者基本数据类型boolean、byte、char、String、Long、Short、Int等类型数据

    使用Intent在Activity之间传递数据

    • 步骤:
    1. 传递数据
      Intent intent=new Intent();
      //键值对
      intent.putExtra("extra", "archie2010");
      //从此ctivity传到另一Activity
      intent.setClass(OneActivity.this, OtherActivity.class);
      //启动另一个Activity
      OneActivity.this.startActivity(intent);
    2. 接收数据
      //获得从上一个Activity传来的intent对象
      Intent intent=getIntent();
      String stringValue=intent.getStringExtra("extra");
    • 传递基本数据类型数据
      Intent putExtra(String name, int[] value)
      Intent putExtra(String name, float value)
      Intent putExtra(String name, byte[] value)
      Intent putExtra(String name, long[] value)
      Intent putExtra(String name, float[] value)
      Intent putExtra(String name, long value)
      Intent putExtra(String name, String[] value)
      Intent putExtra(String name, boolean value)
      Intent putExtra(String name, boolean[] value)
      Intent putExtra(String name, short value)
      Intent putExtra(String name, double value)
      Intent putExtra(String name, short[] value)
      Intent putExtra(String name, String value)
      Intent putExtra(String name, byte value)
      Intent putExtra(String name, char[] value)
      Intent putExtra(String name, CharSequence[] value)

    序列化

    • 什么是序列化 、反序列化
      对象的序列化 : 把Java对象转换为字节序列并存储至一个储存媒介的过程。
      对象的反序列化:把字节序列恢复为Java对象的过程。
      Activity之间还可以传递类的对象,传递之前必须要进行序列化。
      (在Android里面要想在Activity之间传递类的对象,必须将类进行序列化)
    • 序列化的目的
    1. 永久的保存对象数据(将对象数据保存在文件当中,或者是磁盘中)
    2. 通过序列化操作将对象数据在网络上进行传输(由于网络传输是以字节流的方式对数据进行传输的.因此序列化的目的是将对象数据转换成字节流的形式)
    3. 将对象数据在进程之间进行传递(Activity之间传递对象数据时,需要在当前的Activity中对对象数据进行序列化操作.在另一个Activity中需要进行反序列化操作讲数据取出)
    4. Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比JVM的生命周期更长(即每个对象都在JVM中)但在现实应用中,就可能要停止JVM运行,但有要保存某些指定的对象,并在将来重新读取被保存的对象。这是Java对象序列化就能够实现该功能。(可选择入数据库、或文件的形式保存)
    5. 序列化对象的时候只是针对变量进行序列化,不针对方法进行序列化.
    6. 在Intent之间,基本的数据类型直接进行相关传递即可,但是一旦数据类型比较复杂的时候,就需要进行序列化操作了.

    序列化的方式

    1.自定义类实现Serializable接口

    public class Student implements Serializable{
    private String name;
    public String getName() {
    return name;
    }
    public void setName(String name) {
    this.name = name;
    }
    }
    然后传递自定义类的对象
    Bundle.putSerializable(Key,Object); //实现Serializable接口的对象

    • 使用Bundle在Activity之间传递对象数据

    传递数据如下:
    Intent intent=new Intent(MainActivity.this,MyActivity.class
    Bundle bundle=new Bundle();
    Student student=new Student();
    student.setName("张三");
    bundle.putSerializable("student",student); startActivity(intent);

    接收数据如下:
    Intent intent=getIntent();
    Bundle bundle=intent.getExtras();
    Student student=(Student) bundle.getSerializable("student");

    2.自定义类实现Parcelable接口
    • 步骤:
      a、复写describeContents方法和writeToParcel方法
      b、实例化静态内部对象CREATOR,实现接口Parcelable.Creator

    将变量写出
    @Override
    public void writeToParcel(Parcel dest, int flags) {
    // TODO Auto-generated method stub
    dest.writeString(name);
    dest.writeInt(age);
    }

    将变量进行读取
    public static final Creator<Student1> CREATOR =new Creator<Student1>(){
    };

    序列化之后就可以传递对象了,传递方式如下:
    使用Bundle在Activity之间传递对象数据

    传递数据如下:
    Intent intent=new Intent(MainActivity.this,MyActivity.class
    Bundle bundle=new Bundle();
    Student1 student=new Student1();
    student.setName("张三");student.setage(20)
    bundle.putParcelable("student",student);
    intent.putExtras(bundle);
    startActivity(intent);

    接收数据如下:
    Intent intent=getIntent();
    Bundle bundle=intent.getExtras();
    Student1 student=(Student) bundle.getParcelable("student");

    Activity跳转回传

    • 在一些情况下,我们通过 A activity跳转到 B activity上,这时希望 A activtiy能从 B activity上得到一些返回值,这个时候我们就不能使用startActivity方法了,而是使用 startActivityForResult方法来完成我们的操作。
    • 举个例子:页面1跳转到页面2,页面2再返回页面1同时返回数据
      步骤:
    1. 页面1添加如下代码:

    Intent intent = new Intent();
    intent.setClass(页面1.this, 页面2.class);
    Bundle bundle = new Bundle();
    bundle.putInt(“a”,2);
    bundle.putInt(“b”,3);
    intent.putExtras(bundle);
    startActivityForResult(intent, 0);// 跳转并要求返回值,0代表请求值(可以随便写)

    1. 页面2接收数据:

    Intent intent = this.getIntent();
    Bundle bundle = intent.getExtras();
    int a=bundle.getInt("a");//获取页面1传递过来的数
    int b=bundle.getInt(“b”);
    int c=a+b;

    1. 页面2设置返回页面1数据:

    Intent intent = new Intent;
    Bundle bundle = new Bundle();
    bundle.putInt(“sum”,c);
    intent.putExtras(bundle);
    setResult(RESULT_OK, intent);

    4.页面1接收返回数据:(需要重写onActivityResult)
    onActivityResult(int requestCode, int resultCode, Intent data)
      第一个参数:这个整数requestCode用于与startActivityForResult中的requestCode中值进行比较判断,是以便确认返回的数据是从哪个Activity返回的。
      第二个参数:这整数resultCode是由子Activity通过其setResult()方法返回。适用于多个activity都返回数据时,来标识到底是哪一个activity返回的值。
      第三个参数:一个Intent对象,带有返回的数据。可以通过data.getXxxExtra( );方法来获取指定数据类型的数据

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // TODO Auto-generated method stub
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode==0&&resultCode==RESULT_OK){
    Bundle bundle=data.getExtras();
    int sum=bundle.getInt("sum");
    Toast.makeText(MainActivity.this, sum+"", Toast.LENGTH_LONG).show();
    }
    }

    Activity跳转回传注意事项

    protected void onActivityResult(int requestCode, int resultCode, Intent data)
    方法里面的第一个参数,必须要跟startActivityForResult(intent, 0)一致;
    第二个参数,必须与setResult(RESULT_OK, intent2)一致,判断是同一个数字即可

    原因:
    如果出现两个以上回传,请求码设置不同的,回传回来的数据处理就需要根据不同的requestCode进行分别处理。

    小结

    • Activity之间可以用Bundle传递数据,但是Bundle必须放到Intent里面,最后通过Intent传递数据
    • Activity之间进行数据回传,一个Activity可以传递给多个Activity,接收多个Activity返回的数据

    相关文章

      网友评论

        本文标题:Activity跳转(有返回数据跳转)以及传递参数和回传参数

        本文链接:https://www.haomeiwen.com/subject/sngxrctx.html