Intent、Serializable/Parcelable


使用Intent传递数据

要求:点击Button的时候,将Main中的文本传递到Second中显示

MainActivity.java
public class MainActivity extends AppCompatActivity {

    @BindView(R.id.btn)
    Button btn;
    @BindView(R.id.et)
    TextView et;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
    }

    @OnClick(R.id.btn)
    public void onClick() {
        String text = et.getText().toString();
        Intent intent = new Intent(MainActivity.this, SecondActivity.class);
        intent.putExtra("bbb", "电话是");
        intent.putExtra("sss", text);
 	startActivity(intent); 
    }
}


SecondActivity.java
public class SecondActivity extends AppCompatActivity {
    @BindView(R.id.tv)
    TextView tv;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        ButterKnife.bind(this);
        tv.setText(getIntent().getStringExtra("bbb")+getIntent().getStringExtra("sss"));
    }
}

使用Intent传递返回数据

Main:

布局:


java:
public class MainActivity extends AppCompatActivity {

    @BindView(R.id.btn)
    Button btn;
    @BindView(R.id.tv)
    TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
    }

    @OnClick(R.id.btn)
    public void onClick() {
        Intent intent = new Intent(MainActivity.this, SecondActivity.class);
        startActivityForResult(intent, 111);    //请求码111
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 111 && resultCode == RESULT_OK) {    //请求码匹配的情况下,返回码匹配了
            tv.setText(data.getStringExtra("qaz")); //获取intent中携带的名称为qaz的数据
        }
    }
}

Second:
布局:



java:
public class SecondActivity extends AppCompatActivity {
    @BindView(R.id.et)
    EditText et;
    @BindView(R.id.btn)
    Button btn;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        ButterKnife.bind(this);
    }

    @OnClick(R.id.btn)
    public void onClick() {
        Intent intent = new Intent();   //创建一个intent
        intent.putExtra("qaz", et.getText().toString());    //将编辑框中的文本放入intent中,并赋予名称qaz
        setResult(RESULT_OK, intent);   //将intent中的数据作为结果返回,赋予返回码RESULT_OK
        finish();   //返回之后关闭当前界面
    }
}

使用Intent传递对象的两种实现方式

Serializable 序列化

表示将一个对象转换成可存储或可传输的状态。序列化后的对象可以在网络上进行传输,也可以存储到本地。只需要让一个类去实现Serializable 接口就可以实现序列化。

例如:

实现Person类的序列化
public class Person implements Serializable {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
在Studio中,Alt+S,输入{"name":"","age":1}可以自动补全

在MainActivity中(只有Person类实现了序列化才能这样写)
Person person = new Person();
person.setName("Tom");
person.setAge(20);
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("person_data", person);
startActivity(intent);
在SecondActivity中
Person person = (Person) getIntent().getSerializableExtra("person_data");
这里调用getSerializableExtra()方法来获取通过参数传递过来的序列化对象,接着再将它向下转型成Person 对象,这样我们就成功实现了使用Intent 来传递对象的功能了。

Parcelable

Parcelable可以实现与Serializable相同的效果。不过不同于将对象进行序列化,Parcelable 方式的实现原理是将一个完整的对象进行分解,而分解后的每一部分都是Intent 所支持的数据类型,这样也就实现传递对象的功能了。

Person类
public class Person implements Parcelable {
    private String name;
    private int age;

    protected Person(Parcel in) {
        name = in.readString();
        age = in.readInt();
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeInt(age);
    }

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

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

        @Override
        public Person[] newArray(int size) {
            return new Person[size];
        }
    };
}
在Studio中,实现Parcelable之后,定义 private String name; private int age;即可自动补全代码

在SecondActivity中
Person person = (Person) getIntent().getParcelableExtra("person_data");

对比两种方式,Serializable的方式较为简单,但由于会把整个对象进行序列化,因此效率方面会比Parcelable 方式低一些,所以在通常情况下还是更加推荐使用Parcelable 的方式来实现Intent 传递对象的功能。



你可能感兴趣的:(Intent,Serializable,Parcelable)