安卓通過putExtra傳遞資料的幾種方式,安卓putextra

來源:互聯網
上載者:User

安卓通過putExtra傳遞資料的幾種方式,安卓putextra

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

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

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

HashMap<String, Object> map=(HashMap<String, Object>) 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)
可以看到其可以傳遞的包括基礎資料型別 (Elementary Data Type)(含基礎資料型別 (Elementary Data Type)的數組)、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<Person> CREATOR = new Creator<Person>() {         @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


【Android 開發】 : Activity之間傳遞資料的幾種方式

1. 使用Intent來傳遞資料Intent表,很多時候我們都會利用Android的Intent來在各個Activity之間傳遞資料,這也是Android比較官方的一種資料傳遞的方式需求1:從一個Activity(IntentDemo)跳轉到另外一個Activity(Other),其中利用Intent來傳遞資料程式Demo如下:IntentDemo.javapackage com.android.intentdemo; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; public class IntentDemo extends Activity { private Button button; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); initComponent(); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(IntentDemo.this, Other.class); // 在Intent中傳遞資料 intent.putExtra("name", "AHuier"); intent.putExtra("age", 22); intent.putExtra("address", "XiaMen"); // 啟動Intent startActivity(intent); } }); } private void initComponent() { button = (Button) findViewById(R.id.button); } } other.javapackage com.android.intentdemo; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.widget.TextView; public class Other extends Activity { private TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.other); initComponent(); Intent intent = getIntent(); int age = intent.getIntExtra(......餘下全文>>
 
android開發:想用putExtra與getStringExtra來實現資料傳遞,怎使用?

Mission31的onCreate裡面,用getIntent().getExtras();
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.