国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android中Intent傳遞對象的3種方式詳解

2019-12-12 05:08:26
字體:
來源:轉載
供稿:網友

前言

相信Intent的用法大家已經比較熟悉了,Intent可以用來啟動Activity,Service等等,同時我們也可以通過Intent來進行傳遞數據,當我們使用Intent在Activity 間傳遞信息時發現putExtra() 方法并不支持自定義對象的傳輸,下面就來介紹三種解決方式。

一、Serializable 方式

這是最簡單的一種方法,因為我們要做的就是讓我們自定義的對象實現 Serializable 這個空接口。

public class Person implements Serializable{    private String mName;    private String mAddress;    public String getName() {      return mName;    }    public void setName(String name) {        mName = name;    }    public String getAddress() {        return mAddress;    }    public void setAddress(String address) {        mAddress = address;    }}

這個時候,就已經可以使用Intent 的putExtra() 方法傳遞這個自定義對象了,在Activity中這樣使用

      Person person = new Person();      person.setName("Hwaphon");      person.setAddress("Anhui");      Intent intent = new Intent(MainActivity.this,SecondActivity.class);      intent.putExtra("person",person);      startActivity(intent);      finish();

在Activity中接收數據

 Intent intent = getIntent();Person person = (Person) intent.getSerializableExtra("person");

使用Serializable方法雖然十分簡單,但是效率卻不容樂觀,因為它會把整個對象序列化,開銷十分大,為了追求效率,我們不得不使用另一種方法,也就是Parcelable 方法。

二、Parcelable 方式

令自定義類實現Parcelable接口,這個時候必須重寫兩個方法

     1. describeContents() : 用于描述內容接口,一般直接 return 0即可

     2. writeToParcel()  : 用于將想要傳遞的數據寫入到Parcel容器中。

除了這兩個方法以外,我們還需要創建一個 Parcelable.Creator接口的實現,這個接口中也需要我們實現兩個方法

     1. createFromParcel() : 用于將寫入Parcel容器中的數據讀出來,用讀出來的數據實例化一個對象,并且返回。

     2. newArray() :創建一個長度為 size 的數組并且返回,一般而言,直接返回return T[size] 即可。

public class Person implements Parcelable{    private String mName;    private String mAddress;    public String getName() {      return mName;    }    public void setName(String name) {      mName = name;    }    public String getAddress() {        return mAddress;    }    public void setAddress(String address) {      mAddress = address;    }    @Override    public int describeContents() {      return 0;    }    @Override    public void writeToParcel(Parcel parcel, int i) {      parcel.writeString(mName);      parcel.writeString(mAddress);    }  public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>(){      @Override        public Person createFromParcel(Parcel parcel) {          Person person = new Person();          person.mName = parcel.readString();          person.mAddess = parcel.readString();          return person;      }      @Override      public Person[] newArray(int i) {          return new Person[i];      }    };}

這個時候的接收方法與Serializable有點不同,如下

 Intent intent = getIntent(); Person person = (Person) intent.getParcelableExtra("person");

writeToParcel()方法中,我們可以將我們想要的數據寫入容器,如果是我們不需要的數據,那么我們可以放棄寫入,這也是Parcelabel 方法比 Serializable方法高效的原因所在。但是,這種方法比Serializable 方法多了太多的實現代碼了,有沒有什么辦法能改變這一現狀呢?可以使用插件一鍵生成這些代碼,比如說 Android Parcelable code generator 插件,可以直接在Android Studio Plugins去下載該插件,下載完之后 點擊 Alt+Insert就可以看到Parcelable選項了。

三、JSON 方式

這個時候自定義對象類為

public class Person{    private String mName;    private String mAdress;    public String getName() {      return mName;    }    public void setName(String name) {      mName = name;    }    public String getAdress() {        return mAdress;    }    public void setAdress(String adress) {      mAdress = adress;    }  }

使用方式

 //Send Intent intent = new Intent(MainActivity.this,SecondActivity.class); intent.putExtra("person",new Gson().toJson(person));// Receive Intent intent = getIntent(); String JsonData = intent.getStringExtra("person"); Person person = new Gson().fromJson(JsonData,Person.class);

在使用時別忘了導入Gson 包,否則是無法使用的。

總結

以上就是這篇文章的全部內容了,希望能對各位Android開發者們有所幫助,如果有疑問大家可以留言交流。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 神池县| 绍兴县| 扬州市| 公安县| 咸阳市| 醴陵市| 阿尔山市| 清镇市| 古田县| 德令哈市| 孟州市| 晋宁县| 牟定县| 永州市| 宁津县| 望江县| 浑源县| 武功县| 龙岩市| 巴青县| 神农架林区| 西盟| 柳江县| 肃北| 灵武市| 乌兰县| 自贡市| 于都县| 彰化县| 六安市| 宁阳县| 淮南市| 芜湖市| 建昌县| 海兴县| 澄城县| 黄大仙区| 永春县| 治县。| 灌南县| 治县。|