Android中如何使用Intent在Activity之间传递对象[使用Serializable或者Parcelable]


在Android中的不同Activity之间传递对象,我们可以考虑采用Bundle.putSerializable(Key,Object);也可以考虑采用Bundle.putParcelable(Key, Object);其中前面一种方法中的Object要实现Serializable接口,后面一种方法中的Object要实现Parcelable接口。下面我们以一个完整的例子来说明。

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

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


[c-sharp]view plaincopy

  1. <?xmlversion="1.0"encoding="utf-8"?>

  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"

  3. android:orientation="vertical"

  4. android:layout_width="fill_parent"

  5. android:layout_height="fill_parent"

  6. >

  7. <TextView

  8. android:layout_width="fill_parent"

  9. android:layout_height="wrap_content"

  10. android:text="@string/hello"

  11. />

  12. <Button

  13. android:id="@+id/serButton"

  14. android:layout_width="fill_parent"

  15. android:layout_height="wrap_content"

  16. android:text="Serializable"/>

  17. <Button

  18. android:id="@+id/parButton"

  19. android:layout_width="fill_parent"

  20. android:layout_height="wrap_content"

  21. android:text="Parcelable"/>

  22. </LinearLayout>


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

Person.java:


[c-sharp]view plaincopy

  1. packagecom.andy.entity;

  2. importjava.io.Serializable;

  3. publicclassPersonimplementsSerializable{

  4. privatestaticfinallongserialVersionUID=-6919461967497580385L;

  5. privateStringname;

  6. privateintage;

  7. publicStringgetName(){

  8. returnname;

  9. }

  10. publicvoidsetName(Stringname){

  11. this.name=name;

  12. }

  13. publicintgetAge(){

  14. returnage;

  15. }

  16. publicvoidsetAge(intage){

  17. this.age=age;

  18. }

  19. }


Police.java:


[c-sharp]view plaincopy

  1. packagecom.andy.entity;

  2. importandroid.os.Parcel;

  3. importandroid.os.Parcelable;

  4. publicclassPoliceimplementsParcelable{

  5. privateStringname;

  6. privateintworkTime;

  7. publicStringgetName(){

  8. returnname;

  9. }

  10. publicvoidsetName(Stringname){

  11. this.name=name;

  12. }

  13. publicintgetWorkTime(){

  14. returnworkTime;

  15. }

  16. publicvoidsetWorkTime(intworkTime){

  17. this.workTime=workTime;

  18. }

  19. publicstaticfinalParcelable.Creator<Police>CREATOR=newCreator<Police>(){

  20. @Override

  21. publicPolicecreateFromParcel(Parcelsource){

  22. Policepolice=newPolice();

  23. police.name=source.readString();

  24. police.workTime=source.readInt();

  25. returnpolice;

  26. }

  27. @Override

  28. publicPolice[]newArray(intsize){

  29. returnnewPolice[size];

  30. }

  31. };

  32. @Override

  33. publicintdescribeContents(){

  34. return0;

  35. }

  36. @Override

  37. publicvoidwriteToParcel(Parcelparcel,intflags){

  38. parcel.writeString(name);

  39. parcel.writeInt(workTime);

  40. }

  41. }


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


[c-sharp]view plaincopy

  1. packagecom.andy.testdemo;

  2. importcom.andy.entity.Person;

  3. importcom.andy.entity.Police;

  4. importandroid.app.Activity;

  5. importandroid.content.Intent;

  6. importandroid.os.Bundle;

  7. importandroid.view.View;

  8. importandroid.widget.Button;

  9. publicclassTestActivityextendsActivity{

  10. privateButtonsButton,pButton;

  11. publicfinalstaticStringSER_KEY="com.andy.ser";

  12. publicfinalstaticStringPAR_KEY="com.andy.par";

  13. /**Calledwhentheactivityisfirstcreated.*/

  14. @Override

  15. publicvoidonCreate(BundlesavedInstanceState){

  16. super.onCreate(savedInstanceState);

  17. setContentView(R.layout.main);

  18. sButton=(Button)findViewById(R.id.serButton);

  19. sButton.setOnClickListener(newView.OnClickListener(){

  20. @Override

  21. publicvoidonClick(Viewv){

  22. SerializeMethod();

  23. }

  24. });

  25. pButton=(Button)findViewById(R.id.parButton);

  26. pButton.setOnClickListener(newView.OnClickListener(){

  27. @Override

  28. publicvoidonClick(Viewv){

  29. PacelableMethod();

  30. }

  31. });

  32. }

  33. /**

  34. *Serializeable传递对象的方法

  35. */

  36. privatevoidSerializeMethod(){

  37. PersonmPerson=newPerson();

  38. mPerson.setName("andy");

  39. mPerson.setAge(26);

  40. IntentmIntent=newIntent(this,SerializableDemo.class);

  41. BundlemBundle=newBundle();

  42. mBundle.putSerializable(SER_KEY,mPerson);

  43. mIntent.putExtras(mBundle);

  44. startActivity(mIntent);

  45. }

  46. /**

  47. *Pacelable传递对象方法

  48. */

  49. privatevoidPacelableMethod(){

  50. PolicemPolice=newPolice();

  51. mPolice.setName("IamPolice");

  52. mPolice.setWorkTime(2008);

  53. IntentmIntent=newIntent(this,ParcelableDemo.class);

  54. BundlemBundle=newBundle();

  55. mBundle.putParcelable(PAR_KEY,mPolice);

  56. mIntent.putExtras(mBundle);

  57. startActivity(mIntent);

  58. }

  59. }


SerializableDemo.java类


[c-sharp]view plaincopy

  1. packagecom.andy.testdemo;

  2. importcom.andy.entity.Person;

  3. importandroid.app.Activity;

  4. importandroid.os.Bundle;

  5. importandroid.widget.TextView;

  6. publicclassSerializableDemoextendsActivity{

  7. @Override

  8. publicvoidonCreate(BundlesavedInstanceState){

  9. super.onCreate(savedInstanceState);

  10. TextViewmTextView=newTextView(this);

  11. PersonmPerson=(Person)getIntent().getSerializableExtra(TestActivity.SER_KEY);

  12. mTextView.setText("Younameis:"+mPerson.getName()+"/n"+

  13. "Youageis:"+mPerson.getAge());

  14. setContentView(mTextView);

  15. }

  16. }


ParcelableDemo.java类:


[c-sharp]view plaincopy

  1. packagecom.andy.testdemo;

  2. importcom.andy.entity.Police;

  3. importandroid.app.Activity;

  4. importandroid.os.Bundle;

  5. importandroid.widget.TextView;

  6. publicclassParcelableDemoextendsActivity{

  7. @Override

  8. publicvoidonCreate(BundlesavedInstanceState){

  9. super.onCreate(savedInstanceState);

  10. TextViewmTextView=newTextView(this);

  11. PolicemPolice=(Police)getIntent().getParcelableExtra(TestActivity.PAR_KEY);

  12. mTextView.setText("Policenameis:"+mPolice.getName()+"/n"+

  13. "WorkTimeis:"+mPolice.getWorkTime()+"/n");

  14. setContentView(mTextView);

  15. }

  16. }


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


[c-sharp]view plaincopy

  1. <?xmlversion="1.0"encoding="utf-8"?>

  2. <manifestxmlns:android="http://schemas.android.com/apk/res/android"

  3. package="com.andy.testdemo"

  4. android:versionCode="1"

  5. android:versionName="1.0">

  6. <applicationandroid:icon="@drawable/icon"android:label="@string/app_name">

  7. <activityandroid:name=".TestActivity"

  8. android:label="@string/app_name">

  9. <intent-filter>

  10. <actionandroid:name="android.intent.action.MAIN"/>

  11. <categoryandroid:name="android.intent.category.LAUNCHER"/>

  12. </intent-filter>

  13. </activity>

  14. <activityandroid:name=".SerializableDemo"/>

  15. <activityandroid:name=".ParcelableDemo"/>

  16. </application>

  17. <uses-sdkandroid:minSdkVersion="8"/>

  18. </manifest>


6.运行程序查看效果图:

【1】主界面截图:

【2】点击Serializable按钮的效果

【3】点击Parcelable按钮的效果

=========================================================================

以上是如何采用Intent在不同的Activity之间传递对象的例子。


更多相关文章

  1. Android的线程使用来更新UI----View的几种更新方法(Thread、Hand
  2. android解析xml文档的各种方法
  3. android屏幕旋转时,Activity不重新调用onCreate的方法
  4. Android横竖屏切换的解决方法
  5. Android 解决65535的限制(官网推荐方法)
  6. 最新下载 android 源码方法
  7. Android恶意样本批量获取方法
  8. Android Studio部署apk到手机后手机显示中文乱码解决方法

随机推荐

  1. android studio2.0解决办法 Plugin is to
  2. android 学习 之 布局(下)LinearLayout,Rela
  3. Android不让弹出键盘挡住View
  4. Android(安卓)判断网络是否可用以及网络
  5. android 之JSON
  6. ContentProvider
  7. This Android(安卓)SDK requires Android
  8. android (22)
  9. Android:Galaxy Nexus升级到4.1.2,并root(设
  10. Android(安卓)Shape的使用