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
- Intent,Parcelable,Serializable
- Intent、Serializable/Parcelable
- Intent传递对象parcelable、serializable
- Intent 传递对象 Serializable/Parcelable
- Android中Intent传递对象(Serializable,Parcelable)
- Intent使用Serializable以及Parcelable传递数据
- Android Intent传递对象 Serializable & Parcelable
- Intent传递对象——Serializable跟Parcelable区别
- Intent传递对象的两种方法(Serializable,Parcelable)
- Intent传递对象——Serializable和Parcelable区别
- Intent传递对象——Serializable和Parcelable区别
- Intent传递对象实现Parcelable接口和Serializable接口
- Intent传递对象的两种方法Serializable 和 Parcelable
- intent传输对象序列化-parcelable与Serializable
- Intent传递对象——Serializable和Parcelable区别
- Intent传递对象——Serializable和Parcelable区别
- Intent传递对象——Serializable和Parcelable区别
- Intent传递对象的两种方法(Serializable,Parcelable)
- DNS基础知识体系和DNS架构
- 计算机科学与技术专业课程
- JAVA/Android中代码规范!
- Quartz2D绘制饼图
- 9.3浮点数四舍五入
- Intent、Serializable/Parcelable
- LeetCode 20. Valid Parentheses
- 打印所有的水仙花数
- spring揭秘(三)——掌管大局的IoC Service Provider
- 介绍两个Android开源项目:Android显示GIF动画
- 【Java线程】Java内存模型总结
- Unity3D研究院之利用unity自带API提前合并场景Mesh
- C#语法中String与string的区别
- 标准c++中string类函数介绍