码迷,mamicode.com
首页 > 移动开发 > 详细

Android-Intent意图传递数据

时间:2018-12-12 14:57:00      阅读:231      评论:0      收藏:0      [点我收藏+]

标签:body   反序   double   info   实现   获取   art   cti   flag   

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内部的实现是 包装属性 传递属性 读取属性,而不是真正的把对象传递过去,所以效率高,消耗低。

 

??思考一个问题:为什么Intent可以把数据 从OneActivity 传递到 TwoActivity,因为Intent也实现了Parcelable接口

Intent源码:

public class Intent implements Parcelable

 

??思考一个问题:为什么Intent可以把Bundle 从OneActivity 传递到 TwoActivity,因为Bundle也实现了Parcelable接口

Bundle源码:

public final class Bundle extends BaseBundle implements Cloneable, Parcelable 





Android-Intent意图传递数据

标签:body   反序   double   info   实现   获取   art   cti   flag   

原文地址:https://www.cnblogs.com/android-deli/p/10107850.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!