Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 安卓通過putExtra傳遞數據的幾種方式

安卓通過putExtra傳遞數據的幾種方式

編輯:關於Android編程

通過intent傳遞數據時,使用以下代碼報錯:

hMap map=(Map) parent.getItemAtPosition(position);
				intent.putExtra("userInfoMap", map);

但是使用以下的代碼是正常的:

HashMap map=(HashMap) parent.getItemAtPosition(position);
				intent.putExtra("userInfoMap", map);

這是為啥呢,作為小白的我上網查找了一番,發現只有能序列化的數據才能放進去,intent傳遞數據的方法有以下幾個:

Intent 	putExtra(String name, String[] value)
Intent 	putExtra(String name, Parcelable value)
Intent 	putExtra(String name, long value)
Intent 	putExtra(String name, boolean value)
Intent 	putExtra(String name, double value)
Intent 	putExtra(String name, Parcelable[] value)
Intent 	putExtra(String name, char value)
Intent 	putExtra(String name, int[] value)
Intent 	putExtra(String name, int value)
Intent 	putExtra(String name, double[] value)	 	 	 	
Intent 	putExtra(String name, short value) 	 	 	 	 	
Intent 	putExtra(String name, long[] value) 	 	 	 	 	
Intent 	putExtra(String name, boolean[] value) 	 	 	 	 	
Intent 	putExtra(String name, short[] value) 	 	 	 	 	
Intent 	putExtra(String name, String value) 	 	 	 	 	
Intent 	putExtra(String name, Serializable value) 	 	 	 	 	
Intent 	putExtra(String name, float[] value) 	 	 	 	 	
Intent 	putExtra(String name, Bundle value) 	 	 	 	 	
Intent 	putExtra(String name, byte[] value) 	 	 	 	 	
Intent 	putExtra(String name, CharSequence value) 	 	 	 	 	
Intent 	putExtra(String name, char[] value) 	 	 	 	 	
Intent 	putExtra(String name, byte value) 	 	 	 	 	
Intent 	putExtras(Intent src) 	 	 	 	 	
Intent 	putExtras(Bundle extras)
可以看到其可以傳遞的包括基本數據類型(含基本數據類型的數組)、String(包含數組)、Parcelable(包含數組)、Serializable、Bundle、CharSequence、Intent幾種類型的數據。對於Map類型(超類)的數據以及Long,Integer,Double,Byte,Float,Short,由於沒有 實現序列化接口,所以無法通過這種方法傳遞值

對於序列化數據的傳遞方式,可以采用如下方式傳遞

提交activity

 lst.setOnItemClickListener(new OnItemClickListener() {
    
    public void onItemClick(AdapterView parent, View view,
      int position, long id) {
     
     HashMap map=(HashMap) parent.getItemAtPosition(position);
     Intent intent=new Intent();
     intent.setClass(btsAllinfoActivity.this,btsMapActivity.class);
     intent.putExtra("bts_map", map);       
     startActivity(intent);
     
    }
   });

接收數據activity
Intent intent=getIntent();  
map=(HashMap)intent.getSerializableExtra("bts_map");  
  System.out.println("111111111111");
  System.out.println(map.get("bt_id"));
  System.out.println(map.get("bt_name"));
  System.out.println(map.get("bt_lon"));
  System.out.println(map.get("bt_lat"));
  System.out.println("111111111111");
對於Bundle類型的數據,可以采用如下方式:

提交activity

 
HashMap map=(HashMap) parent.getItemAtPosition(position);
     Intent intent=new Intent();
     intent.setClass(btsAllinfoActivity.this,btsMapActivity.class);
     Bundle bundle = new Bundle();   
     bundle.putSerializable("bts_map", map);
     intent.putExtras(bundle);
     
     startActivity(intent);



接收activity
Bundle bundle = getIntent().getExtras();
  
  map=(HashMap)bundle.getSerializable("bts_map");
  
  System.out.println("111111111111");
  System.out.println(map.get("bt_id"));
  System.out.println(map.get("bt_name"));
  System.out.println(map.get("bt_lon"));
  System.out.println(map.get("bt_lat"));
  System.out.println("111111111111");

對於Parcelable類型的數據

對於Android來說傳遞復雜類型,主要是將自己的類轉換為基礎的字節數組,Activity之間傳遞數據是通過Intent實現的。

Android序列化對象主要有兩種方法,實現Serializable接口、或者實現Parcelable接口。

實現Serializable接口是JavaSE本身就支持的,而Parcelable是Android特有的功能,效率比實現Serializable接口高,

而且還可以用在進程間通信(IPC)中。實現Serializable接口非常簡單,聲明一下就可以了。

而實現Parcelable接口稍微復雜一些,但效率更高,推薦用這種方法提高性能。
Parcelable接口的作用:實現了Parcelable接口的實例可以將自身的狀態信息(狀態信息通常指的是各成員變量的值)寫入Parcel,

也可以從Parcel中恢復其狀態。Parcel用來完成數據的序列化傳遞。

對於Parcel數據的傳遞方式,可以采用如下方式傳遞

通過實現Parcelable接口序列化對象的步驟:

1、實現Parcelable接口。
2、並且實現Parcelable接口的public void writeToParcel(Parcel dest, int flags)方法 。
3、自定義類型中必須含有一個名稱為CREATOR的靜態成員,該成員對象要求實現Parcelable.Creator接口及其方法。
實體類實現接口:

public class Person implements Parcelable {
 
    public static final Parcelable.Creator CREATOR = new Creator() {
 
        @Override
        public Person[] newArray(int size) {
            return null;
        }
 
        @Override
        public Person createFromParcel(Parcel source) {
            Person result = new Person();
            result.age = source.readInt();
            result.name = source.readString();
            result.address = source.readParcelable(Address.class.getClassLoader());
            return result;
        }
    };
    private Address address;
    private String name;
    private int age;
 
    @Override
    public int describeContents() {
        return 0;
    }
 
    public Address getAddress() {
        return address;
    }
 
    public void setAddress(Address address) {
        this.address = address;
    }
 
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(age);
        dest.writeString(name);
        dest.writeParcelable(address, PARCELABLE_WRITE_RETURN_VALUE);
    }
 
    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;
    }
 
    @Override
    public String toString() {
        return "Person [address=" + address + ", name=" + name + ", age=" + age
                + "]";
    }
 
}

//官方的文檔裡說在不同進程之間使用Parce,在同進程內使用Bind,
public void sendBroadCast(View viwe){
    Log.d("test",Thread.currentThread().getName()+ "發送了一個消息給廣播");
    Person person = new Person();
    person.setAge(18);
    Address address = new Address();
    address.setStreet("延陵南路");
    person.setName("carlos");
    person.setAddress(address);
    Intent intent = new Intent("aaaa");
    intent.setClass(this, SendActivity.class);
//    intent.putParcelableArrayListExtra(name, value)
    intent.putExtra("person", person);
    startActivity(intent);
    }




參考:http://xiaomi4980.blog.163.com/blog/static/21594519620141236363445/

http://www.cnblogs.com/carlosk/archive/2012/09/28/2707521.html

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved