Android开发之Activity之间的通讯

    在开发过程中,为了方便我们经常需要将一个activity中的值在跳转到下一个activity时进行传值,我们经常遇到的就是对一些基本的数据类型的传递,那么如果是一个对象,或者一个对象集合需要传递时我们应该如何操作呢?本篇博客将解决以上问题,

通过本篇博客你将学到以下知识点:

①使用Intent传递常用的数据类型(int,String,float,double)的方法
②使用Intent传递String集合的方法
③使用Intent传递单个对象的方法(分为:传递实现了 Parcelable的单个对象和实现了 Serializable的单个对象)
④使用Intent传递对象的集合(分为:传递实现了 Parcelable的对象集合和实现了 Serializable的对象集合)
⑤activity之间传递Map

好了我们进入正题首先来对以上情况一一说明
在说Intent传值之前我们首先来看一张Intent所传的值的所有类型的一张图

1.使用Intent传递基本的数据类型

使用Intent传递基本数据类型应该是在开发中最常见的一种形式,从上图中可以看出,android中可以使用Intent传递的基本数据类型有:boolean,byte,char,double,float,short,String以及与之对应的他们的数组,其实除了这些呢还有我们经常遇到的对象。下面我们就上一个实例来对其传递过程进行说明
由于项目比较简单我就先说下项目的大概内容,后面会附上源码。在此项目中有两个Activity一个为MainActivity另一个为ShowActivity,在MainActivity中有一个按钮点击按钮后进行activity的跳转,然后在ShowActivity中把MainActivity中传过来的值显示出来
btnShow.setOnClickListener( new OnClickListener() {
                
         @Override
        public void onClick(View view) {
        Intent intent = new Intent();
        intent.setClass(MainActivity. this,ShowActivity. class);
        /**
        * 传递常用的数据类型
        */
        intent.putExtra( "year", 2015); //int 数据类型
        intent.putExtra( "isValue", true); //boolean 数据类型
        intent.putExtra( "data", "this is a test data"); //String类型
        intent.putExtra( "IntArray", new int[]{1,2}); //int 类型的数组
        intent.putExtra( "StringArray", new String[]{"shanghai","ganzhou" ,"wuhan" }); //String类型的数组
        intent.putExtra( "BooleanArray", new boolean[]{true ,false,true,false}); // boolean类型的数组
        startActivity(intent);
     }
});
在ShowActivity中接收并打印传来的信息代码如下:
      //接收基本数据类型
      intData=getIntent().getIntExtra( "year", 0);
      boolData=getIntent().getBooleanExtra( "isValue", false);
      strData=getIntent().getStringExtra( "data");
      intArray=getIntent().getIntArrayExtra( "IntArray");
      strArray=getIntent().getStringArrayExtra( "StringArray");
      boolArray=getIntent().getBooleanArrayExtra( "BooleanArray");
           
      //拼写textView显示的数据
      sb.append( "Int:"+ intData+ "\n");
      sb.append( "Boolean:"+ boolData+ "\n");
      sb.append( "String:"+ strData+ "\n");
      sb.append( "IntArray:"+ intArray[0]+ ","+ intArray[1]+ "\n");
      sb.append("StringArray:"+strArray [0]+"," +strArray [1]+"," +strArray [2]+"\n" );
      sb.append("BooleanArray:" +boolArray [0]+"," +boolArray [1]+"\n" );
运行之后打印的信息如下:

基本数据类型其他的类型和上面的写法一致我就不在写了。
2.使用Intent传递String集合的方法

     /**
      * String集合
      */
      ArrayList<String> arraylist= new ArrayList<String>();
      arraylist.add( "list1");
      arraylist.add( "list2");
      intent.putStringArrayListExtra( "arraylist", arraylist);
在ShowActivity中接收String集合的代码如下:
      arraylist=getIntent().getStringArrayListExtra("arraylist" );
      sb.append("ArrayList:"+arraylist .get(0)+"," +arraylist .get(1)+"\n" );
打印信息如下:

3.使用Intent传递单个对象的方法
使用Intent传递对象时有两种方法:①此对象实现了 Serializable接口 ②此对象实现了Parcelable接口
如果您对Serializable和Parcelable不是特别了解请看此博客http://blog.csdn.net/dmk877/article/details/48447783
(1)首先来介绍实现了Serializable接口的单个对象我们来创建一个Student类并实现Serializable接口
Student类
package com.example.progressbar;

import java.io.Serializable;

public class Student implements Serializable {
     private static final long serialVersionUID = 1L;
         private String name;
         private int age;
         private String sex;
         public Student(){}
         public Student(String name, int age,String sex){
             this. name=name;
             this. age=age;
             this. sex=sex;
         }
         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;
         }
         public String getSex() {
             return sex;
         }
         public void setSex(String sex) {
             this. sex = sex;
         }
}
那么我们如何来传递Student的对象呢?有下面两种方案
一种是通过Intent传值的方式,传递方法如下:
     /**
      * 传递对象 方式一
      */
     intent.putExtra( "intent_student", new Student("intent传递单个对象" ,20 ,"male" ));
     startActivity(intent);
接收方法如下:
intentStudent =(Student) getIntent().getSerializableExtra("intent_student" );
第二种方法也是建议使用的方法是通过Bundle的方式
     /**
      * 传递对象 方式二
      */
    Bundle bundle=new Bundle();
    bundle.putSerializable( "bundle_student", new Student("bundle传递单个对象" ,18,"female" ));
    intent.putExtras(bundle);
    startActivity(intent);
接收方法如下:
bundleStudent =(Student) getIntent().getSerializableExtra("bundle_student" );
在此要注意的是:I ntent是没有 putSerializable()此方法的。
(2)介绍完传递实现了Serializable接口的单个对象后我们接着来介绍实现了Parcelable接口的单个对象
     我们再来创建一个实现了Parcelable接口的类
 Book类
package com.example.progressbar;
 
import android.os.Parcel;
import android.os.Parcelable;
 
public class Book implements Parcelable{
     
    private String name;
    private int price;
    private String author;
    public Book(){}
    public Book(String name, int price,String author){
        this.name=name;
        this.price=price;
        this.author=author;
    }
     
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public int getPrice() {
        return price;
    }
 
    public void setPrice( int price) {
        this.price = price;
    }
 
    public String getAuthor() {
        return author;
    }
 
    public void setAuthor(String author) {
        this.author = author;
    }
 
    @Override
    public int describeContents() {
        return 0;
    }
   // 该方法将类的数据写入外部提供的Parcel中。
    @Override
    public void writeToParcel(Parcel parcel, int i) {
        parcel.writeString( this. name);
        parcel.writeInt( this. price);
        parcel.writeString( this. author);
         
    }
   // 返回一个Book[i]供外部类反序列化本类数组使用
    public static final Parcelable.Creator<Book> CREATOR= new Creator<Book>() {
         
        @Override
        public Book[] newArray( int i) {
            return new Book[i];
        }
       // 将Parcel对象反序列化为Book对象
        @Override
        public Book createFromParcel(Parcel parcel) {
            // TODO Auto-generated method stub
            return new Book(parcel.readString(), parcel.readInt(), parcel.readString());
        }
    }; 
}
与实现了 Serializable接口的对象类似我们也是用两种方法来传递其对象
第一种传递方式
     /**
      * 传递实现了 Parcelable接口的对象方式一
      */
      Book book1;
      book1= new Book( "Intent传递",210,"杜老师" );
      intent.putExtra( "book1",book1);//将对象  写入到一个Parcel对象中
      startActivity(intent);
接收对象的方式
      Book book1;
      book1=getIntent().getParcelableExtra( "book1");//将Parcel中刚才写入的对象还原
第二种方法也是建议使用的方法是通过Bundle的方式
     /**
      * 传递 Serializable接口的方式二
      */
       Book book2;
       Bundle bundle= new Bundle();
       book2= new Book( "Bundle传递",210,"杜老师" );
       bundle.putParcelable( "book2",book2);//将对象  写入到一个Parcel对象中
       intent.putExtras( bundle);
       startActivity(intent);
接收对象的方式
       Book book2;
       book2=getIntent().getParcelableExtra( "book2");//将Parcel中刚才写入的对象还原
4.使用Intent传递对象的集合
  使用Intent传递对象集合时也有两种方法:①对象实现了Serializable接口 ②对象实现了Parcelable接口
和上面一样我们也分两种情况
(1)传递实现了Serializable接口的对象的集合
传递对象集合的方式如下:
     /**
      * 传递实现了 Serializable接口的对象的集合方式
      */
      ArrayList<Student> stuList= new ArrayList<Student>();
      Student student;
      for( int i=1;i<6;i++){
           student= new Student( "intent传值"+i,10,"male" );
           stuList.add(student);
       }
       //以下两种方式都可以
       intent.putExtra( "stuList",stuList);
       //建议使用如下这种
       intent.putExtra( "stuList1", (Serializable)stuList);
       startActivity(intent);
接收对象集合的方式
       List<Student> stuList;
       stuList= (List<Student>) getIntent().getSerializableExtra("stuList" );
       ArrayList<Student> stuList1 = (ArrayList<Student>) getIntent().getSerializableExtra("stuList1");
(2)传递实现了Parcelable接口的对象的集合
传递实现了 Parcelable接口的对象的集合有如下的两种方式
     /**
      * 传递实现了 Parcelable的对象的集合方式一
      */
      ArrayList<Book> bookList= new ArrayList<Book>();
      Book book;
      for ( int i = 1; i < 5; i++) {
      book= new Book( "BookName"+i, 100+i, "BookAuthor"+i);
      bookList.add(book);
     }

     intent.putParcelableArrayListExtra("bookList" ,bookList);
与之对应的接收对象集合的方法:
ArrayList<Book> bookList=getIntent().getParcelableArrayListExtra("bookList" );

     /**
      * 传递实现了 Parcelable的对象的集合方式二
      */
      Bundle bundle= new Bundle();
      bundle.putParcelableArrayList( "bookList1", bookList);
      intent.putExtras( bundle);
      startActivity(intent);
5.activity之间传递Map
activity之间传递Map我们需要封装一个类
SeralizableMap
package com.example.progressbar;

import java.io.Serializable;
import java.util.Map;

public class SeralizableMap implements Serializable{

     /**
      *
      */
    private static final long serialVersionUID = 1L;
     
    private Map<String,Student> map; 
    public Map<String,Student> getMap() 
    { 
        return map; 
    } 
    public void setMap(Map<String,Student> map) 
    { 
        this.map=map; 
    } 
}
有了此类之后我们可以直接调用 setMap()方法其实它的原理就是传递一个实现了 Serializable接口的对象在需要传值时我们只需要
     /**
      * 传递Map对象
      */
     HashMap<String,Student> arrMap= new HashMap<String,Student>();
     ArrayList<Student> stuListForMap= new ArrayList<Student>();
     Student student1;
     for( int i=0;i<3;i++){
        student1= new Student( "传递的Map",10,"male" );
        stuListForMap.add(student1);
        arrMap.put( ""+i,student1);
     }
                
   SeralizableMap tmpmap= new SeralizableMap(); 
   tmpmap.setMap(arrMap); 
   bundle.putSerializable( "MAP", tmpmap);
我们如何取出Map?实际上就是取出一个实现了 Serializable接口的对象可以采用如下的方式
   HashMap<String,Student> arrMap;
   SeralizableMap tmpmap =  (SeralizableMap) getIntent().getExtras().getSerializable("MAP" );
 然后就可以操作此Map了如想获得Map中key="0"的Student对象的Name可以使用String name=  map.get("0").getName();来获取
好了这一篇就到这里了,看完如果对你有用就顶一个呗。如有疑问和谬误请留言我会在第一时间进行回答和改正。。。睡觉








猜你喜欢

转载自blog.csdn.net/dmk877/article/details/48581541