1. 程式人生 > >Activity 與 Service 實現Parcelable介面傳遞 ArrayList 集合

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 介面,程式碼如下:
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;
			}
		};
其中下面三個方法是實現Parcelable 介面必須實現的:

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裡面有一個歌曲列表

ActivityFragment通訊 多介面實現優化

1.問題 我們都知道Activity與Fragment通訊的幾種方式,推崇的應該是谷歌給出的介面方案。 地址:https://developer.android.com/training/basics/fragments/communicating.html#DefineInterface

Messenger實現ActivityService的雙向通訊

Activity與Service間的單向通訊,相信大家都知道,常用的有下面3種方式: 1. 通過bindService(service, conn, BIND_AUTO_CREATE)開啟Service,然後在ServiceConnection的onServi

Android四大元件應用系列——ActivityService互動實現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 activityservice傳遞資料

方式一:Activity向Service傳遞資料 在activity中,設定要傳遞的值。 Intent intent = new Intent(Main.this, DownloadS

使用Messenger進行ActivityService之間的相互通信

ember hearts 接口 connect sed rst messenger [] ply 在Android開發中,有時候我們需要讓一個Activity綁定一個Service,進行兩者之間的通信。當Activity綁定成功以後,就可以調用Service中的public

Activity DialogFragment 之間的資料傳遞

這篇文章參考了網友的相關資料(因為參考了多名前輩的資料,這裡就不一一指明出處了),不過還是非常感謝前輩們的無私分享。此文僅是學習過後的總結,主要目的是以後自己看著方便,如果恰巧能幫到你那也是再好不過了。(文中程式碼並不全,只是概括了思路,是從我目前的專案中拆下來的) Activity

ActivityService是否處於同一程序? Service 的兩大功能是什麼?

Activity與Service是否處於同一程序?   一般來說:同一個包內的activity和service,如果service沒有設定屬性android:process=":remote"的話,service會和activity跑在同一個程序中,由於一個程序只有一個UI執行緒,所以,service和ac

Android Studio酷炫外掛(一)——自動化快速實現Parcelable介面序列化

一、前言 相信資料序列化大家都多多少少有接觸到,比如自定義了一個實體類,需要在activity之間傳輸該類物件,就需要將資料序列化。android中實現方式有兩種,第一、實現Serializable介面,這種比較簡單,直接宣告就好;第二種,實現Parcelable介面,這種

ActivityManager獲得正在執行的activityservice

ActivityManager mActivityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE) ;

Parcelable介面傳遞Bitmap

Android中Intent傳遞物件有兩個方法,一個是讓物件實現Serializable介面,另一個是讓物件實現Parcelable介面,Sample的話Google搜一下就很多了。 大部分情況,Sample都是傳遞一個只有StringInt等基本型別的物件,如果需要傳

Android檔案儲存的問題:ClassLoader和實現Parcelable介面後 詳解及用途

可能小夥伴們讀了我上一篇部落格關於Android檔案儲存的的,在檔案操作的時候大家有沒有疑問呀,有就對了,可能在儲存自定義物件的時候,如何序列化呀?ClassLoader到底是啥鬼呀?序列化後怎麼讀取出來呀?好吧,針對於上面的問題,我一個一個的說明吧! 今天主

Android中ActivityFragment之間資料相互傳遞

一、Activity啟動Activity Intent intent = new Intent(this,MainListActivity.class); startActivity(intent); Activity與Activity傳遞資料 I

Android 實現Parcelable介面序列化物件

         關於物件序列化的方法,在Android中常用到的一般有兩種,一種是可以通過實現Serializable介面,這也是java語言中常用的序列化方法,別外一種就是實現Parcelable介面,這是android所特有的。這兩個介面,實現Serializab

Android — ActivityService互動之Binder總結

最近在複習Android跨程序呼叫,整理了一下自己對Binder的一些理解,希望能對大家也有所幫助,如有錯誤歡迎指正~ 為了加深理解,希望看完後能自己操練驗證一下,要不真的很容易眼高手低哦 ps:不想細看,可以只看裡面的3張圖片即可~ ^_^ 好了,迴歸

ActivityService的那些事

       服務作為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實現ActivityActivity之間的數據傳遞實現二個Activity的跳轉功能

set second start pub category 方式 nds efi dac 在講參數傳遞之前,先講下intent的定義: Intent intent = new Intent(MainActivity.this,SecondActivity.class