Android---Activity传递值对象的2种方法:Serializable、Parcelable
2018-01-17 00:23
375 查看
方法一、java的序列化接口:java.io.Serializable,操作简单,序列化的操作由系统完成,所以速度慢:
1、新建User.java类,写上get和set方法、构造方法,并实现Serializable:
2、在第一个MainActivity中,通过Intent的putExtra(String name, Serializable value)方法,传递值对象:
3、在第二个SecondActivity中,通过getIntent().getSerializable(String name)方法,接收传递过来的值对象:
结果显示:user info(name=Jamie, age=20)
方法二、Android的Parcelable接口,Android系统中,专门针对于移动设备的序列化接口,效率更高,但操作稍复杂一些, 序列化没有使用系统的序列化机制,需要自己手动完成,速度快:
1、将User.java类实现android.os的Parcelable接口,并实现describleContents()方法、writeToParcel(Parcel parcel, int i)方法。
(1)在writeToParcel方法中,将User的两个属性数据保存进去,方便传递给其它的程序或其他的组件;
(2)此时User类还是有错,光标放到User上会提示Add Parcel implementation,点击后自动创建Creator,泛型为User,里面有2个方法:
①、createFromParcel(Parcel in):通过Parcel创建对象,方法返回一个new User(in.readString(), in.readInt()),把User的两个属性数据读取出来;
②、newArray(int size):创建一个数组,大小为size;
2、MainActivity,通过Intent的putExtra(String name, Parcelable value)方法,传递值对象::
3、SecondActivity,通过getIntent().getParcelableExtra(String name)方法,接收传递过来的值对象::
结果显示:user info(name=Jamie, age=20)
总结:对比以上2种方法,结果是一样的,区别如下:
(1)Serializable操作简单:
调用的是java的序列化接口:java.io.Serializable,序列化的操作由系统完成,所以速度慢:
(2)Parcelable操作复杂:
调用的是Android系统的Parcelable接口,是Android系统中,专门针对于移动设备的序列化接口,效率更高,但操作稍复杂一些,
序列化没有使用系统的序列化机制,需要自己手动完成,速度快:
更多Android、iOS、Python、Java、MySQL的文章,请点击:
更多Java、Unity3D的文章,请点击:
1、新建User.java类,写上get和set方法、构造方法,并实现Serializable:
package top.javaer.app.sound; import java.io.Serializable; /** * Created by Administrator on 2018/1/16. */ public class User implements Serializable { public String name; public int age; public String getName() { return name; } public int getAge() { return age; } public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } public User(String name, int age) { this.name = name; this.age = age; } }
2、在第一个MainActivity中,通过Intent的putExtra(String name, Serializable value)方法,传递值对象:
package top.javaer.app.sound; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import java.io.Serializable; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.startAnotherActivity).setOnClickListener(new View.OnClickListener() { /** * Activity之间通过Intent传递自定义的值对象 * @param view */ @Override public void onClick(View view) { Intent i = new Intent(MainActivity.this, SecondActivity.class); i.putExtra("user", new User("Jamie", 20)); startActivity(i); } }); } }
3、在第二个SecondActivity中,通过getIntent().getSerializable(String name)方法,接收传递过来的值对象:
package top.javaer.app.sound; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.TextView; public class SecondActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); // Activity获取Intent传递过来的值对象 TextView textView = findViewById(R.id.secondText); User user = (User) getIntent().getSerializableExtra("user"); textView.setText(String.format("user info(name=%s, age=%d)", user.getName(), user.getAge())); } }
结果显示:user info(name=Jamie, age=20)
方法二、Android的Parcelable接口,Android系统中,专门针对于移动设备的序列化接口,效率更高,但操作稍复杂一些, 序列化没有使用系统的序列化机制,需要自己手动完成,速度快:
1、将User.java类实现android.os的Parcelable接口,并实现describleContents()方法、writeToParcel(Parcel parcel, int i)方法。
(1)在writeToParcel方法中,将User的两个属性数据保存进去,方便传递给其它的程序或其他的组件;
(2)此时User类还是有错,光标放到User上会提示Add Parcel implementation,点击后自动创建Creator,泛型为User,里面有2个方法:
①、createFromParcel(Parcel in):通过Parcel创建对象,方法返回一个new User(in.readString(), in.readInt()),把User的两个属性数据读取出来;
②、newArray(int size):创建一个数组,大小为size;
package top.javaer.app.sound; import android.os.Parcel; import android.os.Parcelable; /** * Created by Administrator on 2018/1/16. */ public class User implements Parcelable { public String name; public int age; protected User(Parcel in) { name = in.readString(); age = in.readInt(); } public String getName() { return name; } public int getAge() { return age; } public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } public User(String name, int age) { this.name = name; this.age = age; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel parcel, int i) { parcel.writeString(getName()); parcel.writeInt(getAge()); } public static final Creator<User> CREATOR = new Creator<User>() { @Override public User createFromParcel(Parcel in) { return new User(in.readString(), in.readInt()); } @Override public User[] newArray(int size) { return new User[size]; } }; }
2、MainActivity,通过Intent的putExtra(String name, Parcelable value)方法,传递值对象::
package top.javaer.app.sound; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.startAnotherActivity).setOnClickListener(new View.OnClickListener() { /** * Activity之间通过Intent传递自定义的值对象 * @param view */ @Override public void onClick(View view) { Intent i = new Intent(MainActivity.this, SecondActivity.class); i.putExtra("user", new User("Jamie", 20)); startActivity(i); } }); } }
3、SecondActivity,通过getIntent().getParcelableExtra(String name)方法,接收传递过来的值对象::
package top.javaer.app.sound; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.TextView; public class SecondActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); // Activity获取Intent传递过来的值对象 TextView textView = findViewById(R.id.secondText); // User user = (User) getIntent().getSerializableExtra("user"); User user = (User) getIntent().getParcelableExtra("user"); textView.setText(String.format("user info(name=%s, age=%d)", user.getName(), user.getAge())); } }
结果显示:user info(name=Jamie, age=20)
总结:对比以上2种方法,结果是一样的,区别如下:
(1)Serializable操作简单:
调用的是java的序列化接口:java.io.Serializable,序列化的操作由系统完成,所以速度慢:
(2)Parcelable操作复杂:
调用的是Android系统的Parcelable接口,是Android系统中,专门针对于移动设备的序列化接口,效率更高,但操作稍复杂一些,
序列化没有使用系统的序列化机制,需要自己手动完成,速度快:
更多Android、iOS、Python、Java、MySQL的文章,请点击:
http://blog.csdn.net/jamiecheung
更多Java、Unity3D的文章,请点击:
http://blog.csdn.net/u010841622
相关文章推荐
- Android中使用Intent在Activity之间传递对象(使用Serializable或者Parcelable)的方法
- Android中Intent传递对象的两种方法(Serializable,Parcelable)
- Android中Intent传递对象的两种方法(Serializable,Parcelable)
- Android高手进阶教程(十七)之---Android中Intent传递对象的两种方法(Serializable,Parcelable)!
- Android中Intent传递对象的两种方法(Serializable,Parcelable)
- Android中如何使用Intent在Activity之间传递对象[使用Serializable或者Parcelable]
- Android高手进阶教程(十七)之---Android中Intent传递对象的两种方法(Serializable,Parcelable)!
- Android高手进阶教程(十七)之---Android中Intent传递对象的两种方法(Serializable,Parcelable)!
- Android中如何使用Intent在Activity之间传递对象[使用Serializable或者Parcelable]
- 接口对象Android中Intent传递对象的两种方法(Serializable,Parcelable)
- android activity之间传递对象(Serializable 和 Parcelable)
- Android中Intent传递对象的两种方法(Serializable,Parcelable)
- Android高手进阶教程(十七)之---Android中Intent传递对象的两种方法(Serializable,Parcelable)!
- Android高手进阶教程(十六)---Android中Intent传递对象的两种方法(Serializable,Parcelable)!
- Android中Intent传递对象的两种方法(Serializable,Parcelable)
- Android中Intent传递对象的两种方法(Serializable,Parcelable)
- Android中Intent传递对象的两种方法(Serializable,Parcelable)!
- Android中Intent传递对象的两种方法(Serializable,Parcelable)
- Android中Intent传递对象的两种方法(Serializable,Parcelable)
- Android中Intent传递对象的两种方法(Serializable,Parcelable)