Intent、Serializable/Parcelable

来源:互联网 发布:编程小白学 python 编辑:程序博客网 时间:2024/06/05 07:14


使用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:

布局:

<Button    android:id="@+id/btn"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:text="跳转" /><TextView    android:id="@+id/tv"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:text="Hello World!" />

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:
布局:
<EditText    android:id="@+id/et"    android:text="请输入"    android:layout_width="match_parent"    android:layout_height="wrap_content" /><Button    android:id="@+id/btn"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:text="确定" />

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<Person> CREATOR = new Creator<Person>() {        @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 传递对象的功能。



0 0
原创粉丝点击