Activity 與 Service 實現Parcelable介面傳遞 ArrayList 集合
在 Activity 跟 Service 的通訊過程中,一般用來傳遞資料的載體就是Intent了,一般用來傳資料呢,我們都是通過putExtra 函式來傳遞簡單的String,int, long型別的值,
但是現在存在這樣一個問題:
1)在Activity裡面有一個歌曲列表 List, 裡面的物件是自定義的一個MusicInfo類,即 List<MusicInfo> 物件,這是用來展現的。
2)在後臺Service中,也需要這樣一個List<MusicInfo>, 來實現當歌曲播放結束的時候,自動迴圈播放或者順序播放,或者隨機播放。
我想要把整個List<MusicInfo> 給傳過去,那該怎麼辦?
一般來說,將自定義的物件放到 Intent 裡面來傳遞,可以有兩種實現方法:
1)傳遞的物件實現 Serializable 介面,程式碼如下:
class MusicInfo implements Serializable{
private static final long serialVersionUID = -39201440269615431L;
...
}
在設定 Intent 的時候,
intent.putExtra("music", new MusicInfo());
在Service 端接收 Intent 的時候,
intent.getSerializableExtra("music");
2)傳遞的物件實現Parcelable 介面,程式碼如下:
其中下面三個方法是實現Parcelable 介面必須實現的:static class MusicInfo implements Parcelable{ private static final long serialVersionUID = -39201440269615431L; ... @Override public void writeToParcel(Parcel dest, int flags) { dest.writeLong(id); dest.writeString(title); dest.writeString(album); dest.writeString(artist); dest.writeString(url); dest.writeLong(duration); dest.writeLong(size); } public static final Parcelable.Creator<MusicInfo> CREATOR = new Creator<MusicLoader.MusicInfo>() { @Override public MusicInfo[] newArray(int size) { // TODO Auto-generated method stub return new MusicInfo[size]; } @Override public MusicInfo createFromParcel(Parcel source) { // TODO Auto-generated method stub MusicInfo musicInfo = new MusicInfo(); musicInfo.setId(source.readLong()); musicInfo.setTitle(source.readString()); musicInfo.setAlbum(source.readString()); musicInfo.setArtist(source.readString()); musicInfo.setUrl(source.readString()); musicInfo.setDuration(source.readLong()); musicInfo.setSize(source.readLong()); return musicInfo; } };
2)writeToParcel :將 MusicInfo 類中的值寫放到一個Parcel容器中,這就是用來傳遞值的了
3)public static final Parcelable.Creator<T> CREATOR = new Creator<T>() :這是一個靜態的介面,而且其名字一定要是CREATOR (=_=!!), 裡面提供了兩個方法,
3.1)public T[] newArray(int size) {} :返回一個 T 型別的陣列
3.2)public T createFromParcel(Parcel source) {} : 從Parcel 中獲取之前寫入的資料,並封裝成Parcel
對於這個Creator的介面,我的理解是,當我們把資料包裝到Parcel中之後,它會被包裝成一個 T 型別的陣列(Music[] parcel),然後傳遞給Service或者其它Activity的時候,當系統要將Parcel中資料重新解析成我們自定義的物件的時候,它需要去呼叫Creator這個介面,先根據傳入物件的長度 new 出一個T陣列, 然後再CreateFromParcel,將內容轉化成一個一個的 T 型別物件,放到陣列中,返回給接收者。
可能也正是因為封裝陣列這種特性,當我們要在Android中傳遞開篇中提到的 List<MusicInfo> 集合的時候,只能實現Parcelable介面,用Serializable 是實現不了的。
另外有一點要注意的是,我們從Parcel 解析自定義的物件的時候,順序必須跟我們寫進去的順序一致。
傳送跟接收自定義的List<MusicInfo> 的程式碼如下:
intent.putParcelableArrayListExtra(NatureService.MUSICS, (ArrayList<? extends Parcelable>) musicList);
musicList = intent.getParcelableArrayListExtra(MUSICS);
我也嘗試過讓MusicInfo 去實現Serializable 介面,然後放到Intent 中來傳送,但是沒辦法實現,會爆出以下的Exception.
看 Log,其還是用parcelable 介面去解析的。
P.S. 我的MusicInfo是一個子類,所以必須是靜態子類,否則定義public, static 的 CREATOR 介面中時,是會錯誤的。
相關推薦
Activity 與 Service 實現Parcelable介面傳遞 ArrayList 集合
在 Activity 跟 Service 的通訊過程中,一般用來傳遞資料的載體就是Intent了,一般用來傳資料呢,我們都是通過putExtra 函式來傳遞簡單的String,int, long型別的值, 但是現在存在這樣一個問題: 1)在Activity裡面有一個歌曲列表
Activity與Fragment通訊 多介面實現優化
1.問題 我們都知道Activity與Fragment通訊的幾種方式,推崇的應該是谷歌給出的介面方案。 地址:https://developer.android.com/training/basics/fragments/communicating.html#DefineInterface
Messenger實現Activity與Service的雙向通訊
Activity與Service間的單向通訊,相信大家都知道,常用的有下面3種方式: 1. 通過bindService(service, conn, BIND_AUTO_CREATE)開啟Service,然後在ServiceConnection的onServi
Android四大元件應用系列——Activity與Service互動實現APK下載
private Thread downloadThread; private void startDownload(){ downloadThread=new Thread(new Runnable() { @Override public void run
bundle傳遞物件與Serializable、Parcelable介面理解和思考
bundle.putSerializable 或者 bundle.putParcelable 傳進去的物件一定要implements Parcelable 或者 Serializable 這兩個介面。 Serializable 這個介面沒有具體的方法,這個關鍵字主要是標識
Android activity與service傳遞資料
方式一:Activity向Service傳遞資料 在activity中,設定要傳遞的值。 Intent intent = new Intent(Main.this, DownloadS
使用Messenger進行Activity與Service之間的相互通信
ember hearts 接口 connect sed rst messenger [] ply 在Android開發中,有時候我們需要讓一個Activity綁定一個Service,進行兩者之間的通信。當Activity綁定成功以後,就可以調用Service中的public
Activity 與 DialogFragment 之間的資料傳遞
這篇文章參考了網友的相關資料(因為參考了多名前輩的資料,這裡就不一一指明出處了),不過還是非常感謝前輩們的無私分享。此文僅是學習過後的總結,主要目的是以後自己看著方便,如果恰巧能幫到你那也是再好不過了。(文中程式碼並不全,只是概括了思路,是從我目前的專案中拆下來的) Activity
Activity與Service是否處於同一程序? Service 的兩大功能是什麼?
Activity與Service是否處於同一程序? 一般來說:同一個包內的activity和service,如果service沒有設定屬性android:process=":remote"的話,service會和activity跑在同一個程序中,由於一個程序只有一個UI執行緒,所以,service和ac
Android Studio酷炫外掛(一)——自動化快速實現Parcelable介面序列化
一、前言 相信資料序列化大家都多多少少有接觸到,比如自定義了一個實體類,需要在activity之間傳輸該類物件,就需要將資料序列化。android中實現方式有兩種,第一、實現Serializable介面,這種比較簡單,直接宣告就好;第二種,實現Parcelable介面,這種
ActivityManager獲得正在執行的activity與service
ActivityManager mActivityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE) ;
用Parcelable介面傳遞Bitmap
Android中Intent傳遞物件有兩個方法,一個是讓物件實現Serializable介面,另一個是讓物件實現Parcelable介面,Sample的話Google搜一下就很多了。 大部分情況,Sample都是傳遞一個只有StringInt等基本型別的物件,如果需要傳
Android檔案儲存的問題:ClassLoader和實現Parcelable介面後 詳解及用途
可能小夥伴們讀了我上一篇部落格關於Android檔案儲存的的,在檔案操作的時候大家有沒有疑問呀,有就對了,可能在儲存自定義物件的時候,如何序列化呀?ClassLoader到底是啥鬼呀?序列化後怎麼讀取出來呀?好吧,針對於上面的問題,我一個一個的說明吧! 今天主
Android中Activity與Fragment之間資料相互傳遞
一、Activity啟動Activity Intent intent = new Intent(this,MainListActivity.class); startActivity(intent); Activity與Activity傳遞資料 I
Android 實現Parcelable介面序列化物件
關於物件序列化的方法,在Android中常用到的一般有兩種,一種是可以通過實現Serializable介面,這也是java語言中常用的序列化方法,別外一種就是實現Parcelable介面,這是android所特有的。這兩個介面,實現Serializab
Android — Activity與Service互動之Binder總結
最近在複習Android跨程序呼叫,整理了一下自己對Binder的一些理解,希望能對大家也有所幫助,如有錯誤歡迎指正~ 為了加深理解,希望看完後能自己操練驗證一下,要不真的很容易眼高手低哦 ps:不想細看,可以只看裡面的3張圖片即可~ ^_^ 好了,迴歸
Activity與Service的那些事
服務作為Android的四大元件之一,它並不像Activity那樣高調(使用頻繁),它就是那個默默無聞的工作者。 由於不怎麼用到,所以關於它的使用很容易忘記,現在有空就將它記錄下來,方便後期檢視。 服務(Service)是Andro
父類實現Parcelable介面,子類繼承父類需要實現的操作
show me the code public class A implements Parcelable { public String str; public boolea
自定義實現Java中的ArrayList集合
最近準備找工作,就複習了下Java的基礎,順便多看看原始碼,在複習到集合這一章時,就想著自己動手實現集合,就看了看jdk的原始碼,由於筆者本科學的是高分子材料,和計算機、軟體、網際網路完全不沾邊,也沒學過資料結構,但為了多瞭解這方便的知識,就根據jdk的原始碼,模仿了集合的
基於Intent實現Activity與Activity之間的數據傳遞,實現二個Activity的跳轉功能
set second start pub category 方式 nds efi dac 在講參數傳遞之前,先講下intent的定義: Intent intent = new Intent(MainActivity.this,SecondActivity.class