【转】Android中如何使用Bundle传递对象[使用Serializable或者Parcelable] -- 不错

原文网址:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2012/1211/694.html

Android中Bundle类的作用

Bundle类用作携带数据,它类似于Map,用于存放key-value名值对形式的值。相对于Map,它提供了各种常用类型的putXxx()/getXxx()方法,如:putString()/getString()和putInt()/getInt(),putXxx()用于往Bundle对象放入数据,getXxx()方法用于从Bundle对象里获取数据。Bundle的内部实际上是使用了HashMap类型的变量来存放putXxx()方法放入的值。

 

用Bundle可以在Activity中传递基本数据类型,比如int、float、string等,但是现在的需求是如何在Activity中传递对象实例呢?就我目前所知的有两种,分别是java中Serializable和Android新引进的Parcelable方法。

 

 

 我们可以考虑采用Bundle.putSerializable(Key,Object);也可以考虑采用Bundle.putParcelable(Key, Object);其中前面一种方法中的Object必须要实现Serializable接口,后面一种方法中的Object必须要实现Parcelable接口。如果没有实现这两个接口之一,那么我们可以使用Bundle.putSerializable(Key,Object)或者Bundle.putParcelable(Key, Object),但起不到任何作用,下面我们以一个完整的例子来说明。

1.新建一个Android的工程,其中该工程的目录结构如下图:

 

2. 修改main.xml布局文件。布局文件的源码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?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= "@string/hello"
     />
     <Button
        android:id= "@+id/serButton"
        android:layout_width= "fill_parent"
        android:layout_height= "wrap_content"
        android:text= "Serializable" />
     <Button
        android:id= "@+id/parButton"
        android:layout_width= "fill_parent"
        android:layout_height= "wrap_content"
        android:text= "Parcelable" />
</LinearLayout>

3.在工程的src目录下新建一个实体类包,命名为com.andy.entity.同时在该package中添加两个实体类,一个是Person.java,该类实现Serializable接口;一个是Police.java,该类实现Parcelable接口。代码分别如下:

Person.java:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package com.andy.entity;
   
import java.io.Serializable;
   
public class Person implements Serializable {
       
     private static final long serialVersionUID = -6919461967497580385L;
       
     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;
     }
}

Police.java:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package com.andy.entity;
   
import android.os.Parcel;
import android.os.Parcelable;
   
public class Police implements Parcelable {
       
     private String name;
     private int workTime;
   
     public String getName() {
         return name;
     }
   
     public void setName(String name) {
         this .name = name;
     }
   
     public int getWorkTime() {
         return workTime;
     }
   
     public void setWorkTime(int workTime) {
         this .workTime = workTime;
     }
       
     public static final Parcelable.Creator<Police> CREATOR = new Creator<Police>() {
   
         @Override
         public Police createFromParcel(Parcel source) {
             Police police = new Police();
             police.name = source.readString();
             police.workTime = source.readInt();
             return police;
         }
   
         @Override
         public Police[] newArray(int size) {
             return new Police[size];
         }
     };
   
     @Override
     public int describeContents() {
         return 0;
     }
   
     @Override
     public void writeToParcel(Parcel parcel, int flags) {
         parcel.writeString(name);
         parcel.writeInt(workTime);
     }
}

4.在包com.andy.testdemo中修改TestActivity.java类,同时在该包中添加类SerializableDemo和ParcelableDemo,分别继承了Activity类和分别显示Person对象和Police对象的数据。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
package com.andy.testdemo;
   
import com.andy.entity.Person;
import com.andy.entity.Police;
   
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
   
public class TestActivity extends Activity {
     private Button sButton,pButton;
     public final static String SER_KEY = "com.andy.ser" ;
     public final static String PAR_KEY = "com.andy.par" ;
       
     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.main);
           
         sButton = (Button)findViewById(R.id.serButton);
         sButton.setOnClickListener( new View.OnClickListener() {
               
             @Override
             public void onClick(View v) {
                 SerializeMethod();
             }
         });
           
         pButton = (Button)findViewById(R.id.parButton);
         pButton.setOnClickListener( new View.OnClickListener() {
               
             @Override
             public void onClick(View v) {
                 PacelableMethod();
             }
         });
     }
       
     /**
      * Serializeable传递对象的方法
      */
     private void SerializeMethod(){
         Person mPerson = new Person();   
         mPerson.setName( "andy" );   
         mPerson.setAge(26);   
         Intent mIntent = new Intent( this ,SerializableDemo.class);   
         Bundle mBundle = new Bundle();   
         mBundle.putSerializable(SER_KEY,mPerson);   
         mIntent.putExtras(mBundle);   
           
         startActivity(mIntent);   
     }
       
     /**
      * Pacelable传递对象方法 
      */
     private void PacelableMethod(){
         Police mPolice = new Police();   
         mPolice.setName( "I am Police" );      
         mPolice.setWorkTime(2008);   
         Intent mIntent = new Intent( this ,ParcelableDemo.class);   
         Bundle mBundle = new Bundle();   
         mBundle.putParcelable(PAR_KEY, mPolice);   
         mIntent.putExtras(mBundle);   
        
         startActivity(mIntent);   
     }
}

SerializableDemo.java类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.andy.testdemo;
   
import com.andy.entity.Person;
   
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
   
public class SerializableDemo extends Activity {
   
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
           
         TextView mTextView = new TextView( this );   
         Person mPerson = (Person)getIntent().getSerializableExtra(TestActivity.SER_KEY);   
         mTextView.setText( "You name is: " + mPerson.getName() + "/n" +   
                           "You age is: " + mPerson.getAge());   
   
         setContentView(mTextView);   
     }
   
}

ParcelableDemo.java类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.andy.testdemo;
   
import com.andy.entity.Police;
   
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
   
public class ParcelableDemo extends Activity {
   
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
           
         TextView mTextView = new TextView( this );   
         Police mPolice = (Police)getIntent().getParcelableExtra(TestActivity.PAR_KEY);   
         mTextView.setText( "Police name is: " + mPolice.getName()+ "/n" +   
                           "WorkTime is: " + mPolice.getWorkTime() + "/n" );   
         setContentView(mTextView);   
     }
   
}

5.在AndroidManifest.xml文件中为新添加的两个Activity进行注册。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version= "1.0" encoding= "utf-8" ?>
<manifest xmlns:android= "http://schemas.android.com/apk/res/android"
       package= "com.andy.testdemo"
       android:versionCode= "1"
       android:versionName= "1.0" >
     <application android:icon= "@drawable/icon" android:label= "@string/app_name" >
         <activity android:name= ".TestActivity"
                   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= ".SerializableDemo" />
         <activity android:name= ".ParcelableDemo" />
     </application>
     <uses-sdk android:minSdkVersion= "8" />
   
</manifest>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值