Android-Intent意图传递数据

Posted 原创Android 努力学习 专一安卓 持之以恒

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android-Intent意图传递数据相关的知识,希望对你有一定的参考价值。

Intent意图传递基本数据类型:

 

OuterActivity 激活启动 OneActivity 用Intent携带基本数据类型:

/**
     * Intent意图传递数据到另外一个Activity
     */
    public void intentToData(View view) {
        Intent intent = new Intent(this, TwoActivity.class);
        intent.putExtra("name", "乔峰");
        intent.putExtra("age", 40);
        intent.putExtra("fight", 800.65);
        startActivity(intent);
    }

 

OneActivity接收Intent基本数据类型:

     TextView  tvInfo = findViewById(R.id.tv_info);

        Intent intent = getIntent();
        String name = intent.getStringExtra("name");
        int age = intent.getIntExtra("age", 18);
        double fight = intent.getDoubleExtra("fight", 0.0);

        tvInfo.setText("name:" + name + " ,age:" + age + " ,fight:" + fight);

 

 


 

 

OuterActivity 激活启动 OneActivity 用Intent携带基本数据类型:

把数据封装到Bundle里面:

  /**
     * Intent意图传递数据到另外一个Activity
     */
    public void intentToData(View view) {
        Intent intent = new Intent(this, TwoActivity.class);
       
        // 使用Bundle对象来包装数据(Bundle是对Map进行来封装处理,只要是看到putXXX的,一定是对Map进行来封装)
        Bundle bundle = new Bundle();
        bundle.putString("name", "乔峰");
        bundle.putInt("age", 40);
        bundle.putDouble("fight", 800.65);
        intent.putExtras(bundle);
        startActivity(intent);
    }

 

OneActivity接收Intent基本数据类型:

注意:⚠️ 在接收 Bundle 包装的数据 的时候,和获取基本数据类型的方式一模一样,直接intent.getStringExtra();

     TextView  tvInfo = findViewById(R.id.tv_info);

        Intent intent = getIntent();
        String name = intent.getStringExtra("name");
        int age = intent.getIntExtra("age", 18);
        double fight = intent.getDoubleExtra("fight", 0.0);

        tvInfo.setText("name:" + name + " ,age:" + age + " ,fight:" + fight);

 


 

 

Intent传递对象 (Serializable):

需要理解一个概念:序列化就是把内存的数据存在文件里,反序列化就是把文件里的数据读取处理让内存显示

Serializable是Java io 包 中的序列化接口

 

写Dog一个类,实现Serializable接口,Dog类才可以被Intent传递

package liudeli.activity.intent.entity;

import java.io.Serializable;

public class Dog implements Serializable {

    public int id;
    public String name;
    public String color;

    @Override
    public String toString() {
        return "Dog{" +
                "id=" + id +
                ", name=\'" + name + \'\\\'\' +
                ", color=\'" + color + \'\\\'\' +
                \'}\';
    }
}

 

Intent意图传递Serializable对象:

  /**
     * Intent意图传递数据到另外一个Activity
     */
    public void intentToData(View view) {
        Intent intent = new Intent(this, TwoActivity.class);

        Dog dog = new Dog();
        dog.id = 1;
        dog.name = "阿黄";
        dog.color = "金黄色";
        intent.putExtra("dogObject", dog);

        startActivity(intent);

 

接收Intent意图传递过来的Serializable对象:

     TextView  tvInfo = findViewById(R.id.tv_info);

        Intent intent = getIntent();
        Dog dog = (Dog) intent.getSerializableExtra("dogObject");
        tvInfo.setText("dog.id:" + dog.id + "\\n" + "dog.name:" + dog.name + "\\n" + "dog.color:" + dog.color);

 

 


 

 

Intent传递对象 (Parcelable),android开发推荐用Parcelable,消耗低,效率高

需要理解一个概念:序列化就是把内存的数据存在文件里,反序列化就是把文件里的数据读取处理让内存显示

Serializable是Java io     包 中的序列化接口

Parcelable是 android.os 包 中的序列化接口

已经有来Serializable序列化接口,用来传递对象,Android为什么还要搞个Parcelable序列化接口?

答:Serializable是针对JVM虚拟机的,Serializable在Android中运行,效率低;

  而Parcelable是Android专门设计的接口,消耗低,效率高些。

 

写Cat一个类,实现Parcelable接口,Cat类才可以被Intent传递

package liudeli.activity.intent.entity;

import android.os.Parcel;
import android.os.Parcelable;

public class Cat implements Parcelable {

    public int id;
    public String name;
    public double  body;

    public Cat() {

    }

    /**
     * 此构造方法是用于读取数据,顺序必须和writeToParcel方法一模一样
     * @param in
     */
    protected Cat(Parcel in) {
        id = in.readInt();
        name = in.readString();
        body =  in.readDouble();
    }

    public static final Creator<Cat> CREATOR = new Creator<Cat>() {
        @Override
        public Cat createFromParcel(Parcel in) {
            return new Cat(in);
        }

        @Override
        public Cat[] newArray(int size) {
            return new Cat[size];
        }
    };

    @Override
    public int describeContents() {
        return 0;
    }

    /**
     * 此方法是写入数据,顺序必须和Cat(Parcel in)构造方法一模一样
     * @param dest
     * @param flags
     */
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(id);
        dest.writeString(name);
        dest.writeDouble(body);
    }
}

 

 Intent意图传递Parcelable对象:

     Intent intent = new Intent(this, TwoActivity.class);
       
        // 传递Parcelable接口实现类
        Cat cat = new Cat();
        cat.id = 1000;
        cat.name = "小白";
        cat.body = 6.6;
        intent.putExtra("catObject", cat);
        
     startActivity(intent);

 

接收Intent意图传递过来的Parcelable对象: 

     Intent intent = getIntent();
        Cat cat = intent.getParcelableExtra("catObject");
        tvInfo.setText("cat.id:" + cat.id + "\\n" + "cat.name:" + cat.name + "\\n" + "cat.body:" + cat.body);

 

 

Parcelable为什么效率高,消耗低?

答:因为Parcelable内部的实现是 包装属性 传递属性 读取属性,而不是真正的把对象传递过去,所以效率高,消耗低。

 

以上是关于Android-Intent意图传递数据的主要内容,如果未能解决你的问题,请参考以下文章

android-Intent and IntentFilter

从活动接收意图后如何创建片段?

如何在导航抽屉中的两个片段之间传递数据

将数据从片段列表视图项传递到活动字符串变量 onitemclicklistener

如何绕过将数据模型传递给片段参数以避免事务太大异常?

如何确认片段中条带的设置意图?