Android Intent传递对象的两种方法(Serializable,Parcelable)详细介绍

Android Intent传递对象的两种方法(Serializable,Parcelable)详细介绍

今天要给大家讲一下Android中Intent中如何传递对象,就我目前所知道的有两种方法,一种是Bundle.putSerializable(Key,Object);另一种是Bundle.putParcelable(Key, Object);当然这些Object是有一定的条件的,前者是实现了Serializable接口,而后者是实现了Parcelable接口,为了让大家更容易理解我还是照常写了一个简单的Demo,大家就一步一步跟我来吧!

第一步:新建一个Android工程命名为ObjectTranDemo(类比较多哦!)目录结构如下图:

第二步:修改main.xml布局文件(这里我增加了两个按钮)代码如下

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  >
<TextView
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:text="Welcome to Mr wei's blog."
  />
<Button
  android:id="@+id/button1"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:text="Serializable"
/>
<Button
  android:id="@+id/button2"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:text="Parcelable"
/>
</LinearLayout>  

第三步:新建两个类一个是Person.java实现Serializable接口,另一个Book.java实现Parcelable接口,代码分别如下:

Person.java:

package com.tutor.objecttran;
import java.io.Serializable;
public class Person implements Serializable {
  private static final long serialVersionUID = -7060210544600464481L;
  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;
  } 

} 

Book.java:

package com.tutor.objecttran;
import android.os.Parcel;
import android.os.Parcelable;
public class Book implements Parcelable {
  private String bookName;
  private String author;
  private int publishTime; 

  public String getBookName() {
    return bookName;
  }
  public void setBookName(String bookName) {
    this.bookName = bookName;
  }
  public String getAuthor() {
    return author;
  }
  public void setAuthor(String author) {
    this.author = author;
  }
  public int getPublishTime() {
    return publishTime;
  }
  public void setPublishTime(int publishTime) {
    this.publishTime = publishTime;
  } 

  public static final Parcelable.Creator<Book> CREATOR = new Creator<Book>() {
    public Book createFromParcel(Parcel source) {
      Book mBook = new Book();
      mBook.bookName = source.readString();
      mBook.author = source.readString();
      mBook.publishTime = source.readInt();
      return mBook;
    }
    public Book[] newArray(int size) {
      return new Book[size];
    }
  }; 

  public int describeContents() {
    return 0;
  }
  public void writeToParcel(Parcel parcel, int flags) {
    parcel.writeString(bookName);
    parcel.writeString(author);
    parcel.writeInt(publishTime);
  }
} 

第四步:修改ObjectTranDemo.java,并且新建两个Activity,一个是ObjectTranDemo1.java,别一个是ObjectTranDemo2.java.分别用来显示Person对像数据,和Book对象数据:,代码分别如下:

ObjectTranDemo.java:

package com.tutor.objecttran;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class ObjectTranDemo extends Activity implements OnClickListener { 

  private Button sButton,pButton;
  public final static String SER_KEY = "com.tutor.objecttran.ser";
  public final static String PAR_KEY = "com.tutor.objecttran.par";
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    setupViews(); 

  } 

  //我的一贯作风呵呵
  public void setupViews(){
    sButton = (Button)findViewById(R.id.button1);
    pButton = (Button)findViewById(R.id.button2);
    sButton.setOnClickListener(this);
    pButton.setOnClickListener(this);
  }
  //Serializeable传递对象的方法
  public void SerializeMethod(){
    Person mPerson = new Person();
    mPerson.setName("frankie");
    mPerson.setAge(25);
    Intent mIntent = new Intent(this,ObjectTranDemo1.class);
    Bundle mBundle = new Bundle();
    mBundle.putSerializable(SER_KEY,mPerson);
    mIntent.putExtras(mBundle); 

    startActivity(mIntent);
  }
  //Pacelable传递对象方法
  public void PacelableMethod(){
    Book mBook = new Book();
    mBook.setBookName("Android Tutor");
    mBook.setAuthor("Frankie");
    mBook.setPublishTime(2010);
    Intent mIntent = new Intent(this,ObjectTranDemo2.class);
    Bundle mBundle = new Bundle();
    mBundle.putParcelable(PAR_KEY, mBook);
    mIntent.putExtras(mBundle); 

    startActivity(mIntent);
  }
  //铵钮点击事件响应
  public void onClick(View v) {
    if(v == sButton){
      SerializeMethod();
    }else{
      PacelableMethod();
    }
  }
} 

ObjectTranDemo1.java:

package com.tutor.objecttran;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class ObjectTranDemo1 extends Activity {
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); 

    TextView mTextView = new TextView(this);
    Person mPerson = (Person)getIntent().getSerializableExtra(ObjectTranDemo.SER_KEY);
    mTextView.setText("You name is: " + mPerson.getName() + "/n"+
        "You age is: " + mPerson.getAge()); 

    setContentView(mTextView);
  }
} 

ObjectTranDemo2.java:

package com.tutor.objecttran;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class ObjectTranDemo2 extends Activity { 

  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    TextView mTextView = new TextView(this);
    Book mBook = (Book)getIntent().getParcelableExtra(ObjectTranDemo.PAR_KEY);
    mTextView.setText("Book name is: " + mBook.getBookName()+"/n"+
             "Author is: " + mBook.getAuthor() + "/n" +
             "PublishTime is: " + mBook.getPublishTime());
    setContentView(mTextView);
  }
} 

第五步:比较重要的一步啦,修改AndroidManifest.xml文件(将两个新增的Activity,ObjectTranDemo1,ObjectTranDemo2)申明一下代码如下(第14,15行):

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.tutor.objecttran"
   android:versionCode="1"
   android:versionName="1.0">
  <application android:icon="@drawable/icon" android:label="@string/app_name">
    <activity android:name=".ObjectTranDemo"
         android:label="@string/app_name">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
    <activity android:name=".ObjectTranDemo1"></activity>
    <activity android:name=".ObjectTranDemo2"></activity>
  </application>
  <uses-sdk android:minSdkVersion="7" />
</manifest>  

第六步:运行上述工程查看效果图啦:

效果1:首界面:

效果2:点击Serializable按钮

效果3:点击Parcelable按钮:

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • Android中Parcelable的作用实例解析

    在android提供了一种类型:Parcel.被用作封装数据的容器,封装后的数据可以通过Intent或IPC传递. 除了基本类型以外,只有实现了Parcelable接口的类才能被放入Parcel中.   Parcelable实现要点:需要实现三个东西 1)writeToParcel 方法.该方法将类的数据写入外部提供的Parcel中.声明如下: writeToParcel (Parcel dest, int flags) 具体参数含义见javadoc 2)describeContents方法.没

  • Android Parcelable接口使用方法详解

     Android Parcelable接口使用方法详解 1. Parcelable接口 Interface for classes whose instances can be written to and restored from a Parcel. Classes implementing the Parcelable interface must also have a static field called CREATOR, which is an object implementin

  • Android中Intent传递对象的两种方法Serializable,Parcelable

    Android中的传递有两个方法,一个是Serializable,另一个是Parcelable. Serializable是J2SE本身就支持的.而Parcelable是Android所特有的. 二者的使用场景和区别: 1)在使用内存的时候,Parcelable比Serializable性能高,所以推荐使用Parcelable. 2)Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC. 3)Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelab

  • 很详细的android序列化过程Parcelable

    直接上代码:注释都写的很清楚了. public class Entry implements Parcelable{ public int userID; public String username; public boolean isMale; public Book book;//序列化对象可以嵌套序列化对象,前提是2个类的对象都被序列号过 //几乎所有情况下都返回0,可以不管 @Override public int describeContents() { return 0; } //

  • Android中使用Intent在Activity之间传递对象(使用Serializable或者Parcelable)的方法

    Android中的不同Activity之间传递对象,我们可以考虑采用Bundle.putSerializable(Key,Object);也可以考虑采用Bundle.putParcelable(Key, Object);其中前面一种方法中的Object要实现Serializable接口,后面一种方法中的Object要实现Parcelable接口.下面我们以一个完整的例子来说明. 1.新建一个Android的工程,其中该工程的目录结构如下图: 2. 修改main.xml布局文件.布局文件的源码如下

  • Android中的Parcelable序列化对象

    今天查阅资料,简单了解了一下Parcelable接口,它是android提供的序列化对象的接口,比java中的 Serializable高效些.通过这个接口序列化对象主要有两步: 1.实现public void writeToParcel(Parcel dest, int flags) {}方法: 2.实例化CREATOR public static final Parcelable.Creator<ParcelableImpl> CREATOR = new Parcelable.Creato

  • Android Parcelable与Serializable详解及区别

    Android Parcelable与 Serializable区别 1.作用 Serializable的作用是为了保存对象的属性到本地文件.数据库.网络流.rmi以方便数据传输,当然这种传输可以是程序内的也可以是两个程序间的.而Android的Parcelable的设计初衷是因为Serializable效率过慢,为了在程序内不同组件间以及不同Android程序间(AIDL)高效的传输数据而设计,这些数据仅在内存中存在,Parcelable是通过IBinder通信的消息的载体. 从上面的设计上我

  • Android中Serializable和Parcelable序列化对象详解

    本文详细对Android中Serializable和Parcelable序列化对象进行学习,具体内容如下 学习内容: 1.序列化的目的 2.Android中序列化的两种方式 3.Parcelable与Serializable的性能比较 4.Android中如何使用Parcelable进行序列化操作 5.Parcelable的工作原理 6.相关实例  1.序列化的目的 1).永久的保存对象数据(将对象数据保存在文件当中,或者是磁盘中 2).通过序列化操作将对象数据在网络上进行传输(由于网络传输是以

  • Android Intent传递对象的两种方法(Serializable,Parcelable)详细介绍

    Android Intent传递对象的两种方法(Serializable,Parcelable)详细介绍 今天要给大家讲一下Android中Intent中如何传递对象,就我目前所知道的有两种方法,一种是Bundle.putSerializable(Key,Object);另一种是Bundle.putParcelable(Key, Object);当然这些Object是有一定的条件的,前者是实现了Serializable接口,而后者是实现了Parcelable接口,为了让大家更容易理解我还是照常写

  • Android实现图片叠加效果的两种方法

    本文实例讲述了Android实现图片叠加效果的两种方法.分享给大家供大家参考,具体如下: 效果图: 第一种: 第二种: 第一种是通过canvas画出来的效果: public void first(View v) { // 防止出现Immutable bitmap passed to Canvas constructor错误 Bitmap bitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.apple).copy(Bi

  • Android开发中播放声音的两种方法分析

    本文实例讲述了Android开发中播放声音的两种方法.分享给大家供大家参考,具体如下: 在Android中,音频.视频等多媒体元素的加入,使得应用程序的用户体验更好.可以说,现在的手机,已经远远不只作为通信工具,更成为娱乐.办公的必备产品. Android提供了简单的音频API.一般大家使用的是MediaPlayer播放音频,这也是最常见的一种播放声音的工具.这种工具在互联网上有大量的实例,因此在此只做简单的介绍. 对播放行为的控制是三个大家非常熟悉的方法:start().stop()和paus

  • Angular 向组件传递模板的两种方法

    最近在写一个日期选择器组件,为了满足将来可能出现的各种需求,所以需要能够高度的自定义组件的样式.为了达到这个目的,需要能够在日期选择器组件外控制每个日期格子内要显示的内容,比如,标上节假日之类的.这时候,组件的一部分模板就需要由调用方提供. 在 React 里面,这种需求挺简单的,只要实现一个 date => Element 这样的函数就好了,但是 Angular 模板是纯粹的模板,需要使用一些专门的概念才能实现这个功能. 第一种方式 <ng-content> <ng-conten

  • Android 获取 usb 权限的两种方法

    前言: 最近工作上遇到几个USB模块在android平台上适配使用的情况,所以要用到USB权限获取问题 ##USB权限获取有以下2种方式: 一.直接在AndroidManifest.xml文件中进行如下配置: <activity android:name=".DemoCustomAndroidUSBActivity" android:label="@string/app_name"> <intent-filter> <action an

  • Python中的is和==比较两个对象的两种方法

    Python中的is和==比较两个对象的两种方法 在Python中有两种方式比较两个对象是否相等,分别是is和==,两者之间是不同的 ==比较的是值(如同java中的equals方法) is比较的是引用(可以看作比较内存地址, 类似于java中的==) 对于: >>> n = 1 >>> n is 1 True >>> b = '1' >>> b is 1 False >>> n == b False 由于1和'1'

  • 使用android studio导入模块的两种方法(超详细)

    第一种方法 1,首先自己创建一个新的android项目,选择Empty Activity,一直选择默认项 2,file->new->import module 3.选择模块文件,点击finish 4.点击file->project Structure, 5,选中Modules下的app,注意这个app就是你自己new project的module,下面这个huyubao就是我之前添加的,再选择Dependencies 6.点击+号,选中Module dependency 7,选中之前导入

  • Android引用arr包的两种方法

    android中引用的包一般分为两种: 1.jar包 2.arr包 arr包其实带有res的jar包,而普通的jar包是不带资源文件的.那么如何在项目中引用呢? 1.将arr包复制到libs目录下 2.在build.gradle文件中添加一个本地仓库,并把libs目录作为仓库的地址. repositories {flatDir {dirs 'libs'}} android{ . . . repositories { flatDir { dirs 'libs' } } . . . } 3.在bui

  • Android清除应用缓存的两种方法

    第一种 使用ActivityManager中的clearApplicationUserData方法,代码如下: ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); am.clearApplicationUserData(); 这种方式的问题就是不知清除cache,连带应用的data也删除了.如下图所示: 第二种 使用PackageManager中的deleteApplicationC

随机推荐