編輯:關於Android編程
前言
相信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開發者們有所幫助,如果有疑問大家可以留言交流。
log類的繼承結構Logpublic final class Log extends Object java.lang.Object ? android.uti
1. Message 消息,理解為線程間通訊的數據單元。例如後台線程在處理數據完畢後需要更新UI,則可發送一條包含更新信息的Message給UI線程。 2.
Intent隱式通訊Intent對象可以向操作系統描述我們需要處理的任務。使用顯式intent,我們需明確地告訴操作系統要啟動的activity類名。下面是之前創建過的顯
本篇記錄的是Android開發中OkHttp框架的使用,下面介紹OkHttp庫的用法,本篇會給出OkHttp的使用demo,demo中包含了常用的get請求、post請求