接触安桌不久,在之后很长的一段时间我将会一直在研究安桌开发。只是为了实现一下自己的想法。
1.首先要说parcelable之前必须要说一下,Serializable接口。看了很多教程,在说Activity数值传递的过程便是要先说Serializable接口,然后才是parvelable接口。两个接口相类似,有什么区别?
Parcelable和Serializable的作用、效率、区别及选择: 1、作用 Serializable的作用是为了保存对象的属性到本地文件、数据库、网络流、rmi以方便数据传输,当然这种传输可以是程序内的也 可以是两个程序间的。而Android的Parcelable的设计初衷是因为Serializable效率过慢,为了在程序内不同组件间以及不同Android 程序间()高效的传输数据而设计,这些数据仅在内存中存在,Parcelable是通过IBinder通信的消息的载体。 从上面的设计上我们就可以看出优劣了。 2、效率及选择 Parcelable的性能比Serializable好,在内存开销方面较小,所以在内存间数据传输时推荐使用Parcelable,如activity间传输数据, 而Serializable可将数据持久化方便保存,所以在需要保存或网络传输数据时选择Serializable,因为android不同版本Parcelable可能 不同,所以不推荐使用Parcelable进行数据持久化 3、编程实现 对于Serializable,类只需要实现Serializable接口,并提供一个序列化版本id(serialVersionUID)即可。而Parcelable则需要实现 writeToParcel、describeContents函数以及静态的变量,实际上就是将如何打包和解包的工作自己来定义,而序列化的 这些操作完全由底层实现。
Parcelable接口的作用:实现了Parcelable接口的实例可以将自身的状态信息(状态信息通常指的是各成员变量的值)写入Parcel,也可以从Parcel中恢复其状态。Parcel用来完成数据的序列化传递。
1 2 3 4 |
|
3.Parcelable接口定义
public interface Parcelable { //内容描述接口,基本不用管 public int describeContents(); //写入接口函数,打包 public void writeToParcel(Parcel dest, int flags); //读取接口,目的是要从Parcel中构造一个实现了Parcelable的类的实例处理。 //因为实现类在这里还是不可知的,所以需要用到模板的方式,继承类名通过模板参数传入 //为了能够实现模板参数的传入,这里定义Creator嵌入接口,内含两个接口函数分别返回单个和多个继承类实例 public interface Creator<T> { public T createFromParcel(Parcel source); public T[] newArray(int size); } }
4.实现Parcelable接口
首先看一个简单的实现例子:
package com.example.root.pracact; import android.os.Parcel; import android.os.Parcelable; /** * Created by root on 15-8-14. */ public class MyParcelable implements Parcelable { private String str; private int in; public MyParcelable(String str, int in) { this.str= str; this.in = in; } //首先定义要传递的数值变量 public String getStr() { return str; } public void setStr(String str) { this.str = str; } public void setIn(int in) { this.in = in; } public int getIn() { return in; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(str); dest.writeInt(in); } //write操作把数据写入parcel中 public static final Creator<MyParcelable> CREATOR = new Creator<MyParcelable>() { @Override public MyParcelable createFromParcel(Parcel source) { return new MyParcelable(source.readString(),source.readInt()); } //读取parcel的数据,对parcel中的数据进行还原,这样我们就具有了一个有和传入的MyParcelbale对象有着相同实例变量值的 // 还原后的MyParcelable对象,这样就实现了对象的传递。 @Override public MyParcelable[] newArray(int size) { return new MyParcelable[size]; } }; }
有了这个基础,我们看一下在两个activity中进行传递数值的例子
第一个是User类,在这个user类中实现了parcel的写入与还原
User.java
package com.example.root.paragainact; import android.os.Parcel; import android.os.Parcelable; /** * Created by root on 15-8-15. */ public class User implements Parcelable { private String username; private int password; public int getPassword() { return password; } public void setPassword(int password) { this.password = password; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public User(String username,int password){ this.password = password; this.username = username; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(getUsername()); dest.writeInt(getPassword()); } public static final Creator<User> CREATOR = new Creator<User>(){ @Override public User createFromParcel(Parcel source) { return new User(source.readString(),source.readInt()); } @Override public User[] newArray(int size) { return new User[size]; } }; }
MainActivity.java
package com.example.root.paragainact; import android.content.Intent; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.Button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent i =new Intent(MainActivity.this,AnotherAct.class); i.putExtra("user",new User("admin",123456)); startActivity(i); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }
AnotherAct.java
package com.example.root.paragainact; import android.content.Intent; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.widget.TextView; public class AnotherAct extends ActionBarActivity { private TextView tv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_another); tv = (TextView) findViewById(R.id.tv); Intent i =getIntent(); User user = i.getParcelableExtra("user"); tv.setText(String.format("User_info(Username:%s,Password:%d)",user.getUsername(),user.getPassword())); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_another, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }
钟志远 江苏南京 904727147
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-14 22:44:15