25、Android中通过Intent传递对象、集合问题
2012-03-13 16:25
579 查看
Android高手进阶教程(十七)之---Android中Intent传递对象的两种方法(Serializable,Parcelable)!
分类: Android高手进阶2010-07-1622:13 26776人阅读 评论(103) 收藏 举报
大家好,好久不见,今天要给大家讲一下Android中Intent中如何传递对象,就我目前所知道的有两种方法,一种是Bundle.putSerializable(Key,Object);另一种是Bundle.putParcelable(Key, Object);当然这些Object是有一定的条件的,前者是实现了Serializable接口,而后者是实现了Parcelable接口,为了让大家更容易理解我还是照常写了一个简单的Demo,大家就一步一步跟我来吧!
第一步:新建一个Android工程命名为ObjectTranDemo(类比较多哦!)目录结构如下图:
第二步:修改main.xml布局文件(这里我增加了两个按钮)代码如下
[b][java] view
plaincopy
<?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:
[java] view
plaincopy
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:
[javascript] view
plaincopy
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:
[java] view
plaincopy
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:
[java] view
plaincopy
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:
[java] view
plaincopy
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行):
[java] view
plaincopy
<?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按钮:
OK~今天就先到这里了,大家如果要嫌代码过长,不想敲的话,可以留下Email.俺给你邮过去,呵呵~希望对大家 有点小帮助 ,bye~
[/b]
刚刚接触android不久所以对intent中传递数据不是很来了解特此记录下来以备忘
同时也希望一次来帮助新手(至少我经历过应该可以说是老手了吧,呵呵。。。往脸上贴金了!)另外我还对intent中传递参数还有一点小问题希望有人能为我解释一下疑惑
入正题:
需求:在多个activity之间传递对象集合
解决方案:
第一:我们可以定义一个继承application的这样的一个类这样我们就可以在整个应用中使用了 此方案可行!
第二:我们可以通过intent 来传递。
关于intent的知识回顾:
对intent 中传递参数的问题并不麻烦,我们知道intent中可以传递基本数据类的数据,可以传递String 可以传递 对象(但是对象必须实现序列化),另外intent也可以传递集合
但是对于集合有限制只能传递ArrayList,而且还必须是包装了泛型是Integer 或者String 这样形式的,但是根据我的需求intent 貌似满足不了,但是intent 中可以传递bundle在bundle 中我们可以看到能够传递一个实现了parcelable接口的对象集合
具体代码如下:
实体:
Java代码
public class OBean implements Serializable,Parcelable {
private static final long serialVersionUID = 1L;
private String messageName;
private String xmlPath;
public OBean(){}
private OBean(Parcel parcel){
messageName = parcel.readString();
xmlPath = parcel.readString();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(messageName);
dest.writeString(xmlPath);
}
public static final Parcelable.Creator<OBean> CREATOR = new Parcelable.Creator<OBean>() {
@Override
public OBean createFromParcel(Parcel source) {
return new OBean(source);
}
@Override
public OBean[] newArray(int size) {
return new OBean[size];
}
};
public String getMessageName() {
return messageName;
}
public void setMessageName(String messageName) {
this.messageName = messageName;
}
public String getXmlPath() {
return xmlPath;
}
public void setXmlPath(String xmlPath) {
this.xmlPath = xmlPath;
}
public static long getSerialversionuid() {
return serialVersionUID;
}
@Override
public int describeContents() {
return 0;
}
}
我们实现了parcelable接口 实现了序列化;可以看到Parcelable 帮我们为OBean赋值了
但是这个过程中我有一点不明白如下:
Java代码
private OBean(Parcel parcel){
messageName = parcel.readString();
xmlPath = parcel.readString();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(messageName);
dest.writeString(xmlPath);
}
这个过程的readString 和writeString 有没有顺序的限制?
我看了相关文档结果没有发现能够帮我理解此问题的有利根据,所以希望哪位大神能指点一下
如上所述完成了 这一个过程就基本上完成了传递对象集合的80%了
剩下的20%:
Java代码
ArrayList<OBean> list = OMessageParser.getOMessageBean(context,"OMessage.xml");
Intent OMIntent = new Intent();
Bundle bundle = new Bundle();
bundle.putParcelableArrayList("OBeanList", list);
这样的话我们在
putParcelableArrayList 的时候只需要把 包装好的ArrayList<OBean> 写进去就好了
但是到这个地方我还是有疑问了。。为什么intent 只能传递ArrayList不能传递List或者其他的数据结构呢?
相关文章推荐
- Android中通过Intent传递对象、集合问题
- Android中通过Intent传递对象、集合问题
- Android中通过Intent传递对象、集合问题
- Android四大组件之Intent-01-通过 Intent 传递类对象
- 在Android中通过Intent使用Bundle传递对象的使用方法
- Android 通过 Intent 传递类对象
- Android 如何通过Intent在activity之间传递自定义对象 推荐
- 在Android中通过Intent使用Bundle传递对象
- Android:通过Intent传递对象、Parcelable
- 在Android中通过Intent使用Bundle传递对象
- Android Intent Parcelable接口传递对象遇到的问题
- Android--通过Intent使用Bundle如何传递对象
- Android 开发笔记——通过 Intent 传递类对象
- Android 开发笔记——通过 Intent 传递类对象
- Android 通过 Intent 传递类对象
- Android 开发笔记——通过 Intent 传递类对象
- Android 通过 Intent 传递类对象或list对象
- android Intent传递对象和集合
- Android 开发笔记——通过 Intent 传递类对象
- Android:通过Intent在两个Activity之间传递对象(Parcelable)