1. 程式人生 > >Android五種資料傳遞方法彙總

Android五種資料傳遞方法彙總

       Android開發中,在不同模組(如Activity)間經常會有各種各樣的資料需要相互傳遞,我把常用的幾種
方法都收集到了一起。它們各有利弊,有各自的應用場景。
我現在把它們集中到一個例子中展示,在例子中每一個按紐代表了一種實現方法。

1. 利用Intent物件攜帶簡單資料

利用Intent的Extra部分來儲存我們想要傳遞的資料,可以傳送int, long, char等些基礎型別,對複雜的物件就無能為力了。

1.1 設定引數

         //傳遞些簡單的引數
	 Intent intentSimple = new Intent();
	 intentSimple.setClass(MainActivity.this,SimpleActivity.class);
	
	 Bundle bundleSimple = new Bundle();
	 bundleSimple.putString("usr", "xcl");
	 bundleSimple.putString("pwd", "zj");
	 intentSimple.putExtras(bundleSimple);
					 
	 startActivity(intentSimple);
1.2接收引數
          this.setTitle("簡單的引數傳遞例子");
		
	  //接收引數
	  Bundle bunde = this.getIntent().getExtras();
	  String eml = bunde.getString("usr");
	  String pwd = bunde.getString("pwd"); 

2. 利用Intent物件攜帶如ArrayList之類複雜些的資料

這種原理是和上面一種是一樣的,只是要注意下。 在傳引數前,要用新增加一個List將物件包起來。

2.1 設定引數

		//傳遞複雜些的引數
		Map<String, Object> map1 = new HashMap<String, Object>();
		map1.put("key1", "value1");
		map1.put("key2", "value2");
		List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
		list.add(map1);
							 
		Intent intent = new Intent();
		intent.setClass(MainActivity.this,ComplexActivity.class);
		Bundle bundle = new Bundle();
		//須定義一個list用於在budnle中傳遞需要傳遞的ArrayList<Object>,這個是必須要的
		ArrayList bundlelist = new ArrayList(); 
		bundlelist.add(list); 
		bundle.putParcelableArrayList("list",bundlelist);
		intent.putExtras(bundle);              
		startActivity(intent);
2.1 接收引數
   this.setTitle("複雜引數傳遞例子");
		
	    //接收引數
	     Bundle bundle = getIntent().getExtras(); 
	     ArrayList list = bundle.getParcelableArrayList("list");
	    //從List中將引數轉回 List<Map<String, Object>>
	     List<Map<String, Object>> lists= (List<Map<String, Object>>)list.get(0);
	   
	     String sResult = "";
	     for (Map<String, Object> m : lists)  
	     {  
	    	 for (String k : m.keySet())  
	         {  
	    	      sResult += "\r\n"+k + " : " + m.get(k);  
	         }  	    
	     }  

3. 通過實現Serializable介面

3.1 設定引數

利用Java語言本身的特性,通過將資料序列化後,再將其傳遞出去。

 		//通過Serializable介面傳引數的例子
 		HashMap<String,String> map2 = new HashMap<String,String>();
 		map2.put("key1", "value1");
 		map2.put("key2", "value2");
 		
 		Bundle bundleSerializable = new Bundle();
 		bundleSerializable.putSerializable("serializable", map2);
 		Intent intentSerializable = new Intent();	
 		intentSerializable.putExtras(bundleSerializable);
 		intentSerializable.setClass(MainActivity.this, 
 									SerializableActivity.class); 			 		
 		startActivity(intentSerializable);  

3.2 接收引數

            this.setTitle("Serializable例子");

	   //接收引數
	    Bundle bundle = this.getIntent().getExtras();	
	    //如果傳 LinkedHashMap,則bundle.getSerializable轉換時會報ClassCastException,不知道什麼原因
	    //傳HashMap倒沒有問題。	     
	    HashMap<String,String> map =  (HashMap<String,String>)bundle.getSerializable("serializable");
	     						
		String sResult = "map.size() ="+map.size();
		
		Iterator iter = map.entrySet().iterator();
		while(iter.hasNext())
		{
			Map.Entry entry = (Map.Entry)iter.next();
			Object key = entry.getKey();
			Object value = entry.getValue();
			sResult +="\r\n key----> "+(String)key;
			sResult +="\r\n value----> "+(String)value;			
		}

4. 通過實現Parcelable介面

這個是通過實現Parcelable介面,把要傳的資料打包在裡面,然後在接收端自己分解出來。這個是Android獨有的,在其本身的原始碼中也用得很多,

效率要比Serializable相對要好。

4.1 首先要定義一個類,用於 實現Parcelable介面

因為其本質也是序列化資料,所以這裡要注意定義順序要與解析順序要一致噢。

public class XclParcelable implements Parcelable {
	
    //定義要被傳輸的資料
    public int mInt;
    public String mStr;
    public HashMap<String,String> mMap = new HashMap<String,String>();
    
    //Describe the kinds of special objects contained in this Parcelable's marshalled representation.
    public int describeContents() {
        return 0;
    }

    //Flatten this object in to a Parcel.
    public void writeToParcel(Parcel out, int flags) {
    	//等於將資料對映到Parcel中去
        out.writeInt(mInt);        
        out.writeString(mStr);
        out.writeMap(mMap);
    }

    //Interface that must be implemented and provided as a public CREATOR field 
    //that generates instances of your Parcelable class from a Parcel. 
    public static final Parcelable.Creator<XclParcelable> CREATOR
            = new Parcelable.Creator<XclParcelable>() {
        public XclParcelable createFromParcel(Parcel in) {
            return new XclParcelable(in);
        }

        public XclParcelable[] newArray(int size) {
            return new XclParcelable[size];
        }
    };
    
    private XclParcelable(Parcel in) {
    	//將對映在Parcel物件中的資料還原回來
    	//警告,這裡順序一定要和writeToParcel中定義的順序一致才行!!!
    	mInt = in.readInt();    	
    	mStr  = in.readString();
    	mMap  = in.readHashMap(HashMap.class.getClassLoader());
    }

	public XclParcelable() {
		// TODO Auto-generated constructor stub
	}
}

4.2  設定引數
//通過實現Parcelable介面傳參的例子
			 		Intent intentParcelable = new Intent();			 		
			 		XclParcelable xp = new XclParcelable();			 	
			 		xp.mInt = 1;
			 		xp.mStr = "字串";
			 		xp.mMap = new HashMap<String,String>();
			 		xp.mMap.put("key", "value");			 		
			 		intentParcelable.putExtra("Parcelable", xp);   			 		
			 		intentParcelable.setClass(MainActivity.this, 
			 								  ParcelableActivity.class);   
			        startActivity(intentParcelable);   

4.3 接收引數
this.setTitle("Parcelable例子");
		
		//接收引數
		Intent i = getIntent();   
		XclParcelable xp = i.getParcelableExtra("Parcelable");   

		TextView  tv = (TextView)findViewById(R.id.tv);
		tv.setText(  " mInt ="+xp.mInt 
					+"\r\n mStr"+xp.mStr
					+"\r\n size()="+xp.mMap.size());

5. 通過單例模式實現引數傳遞

    單例模式的特點就是可以保證系統中一個類有且只有一個例項。這樣很容易就能實現,
在A中設定引數,在B中直接訪問了。這是幾種方法中效率最高的。

5.1  定義一個單例項的類

//單例模式
public class XclSingleton
{
	//單例模式例項
	private static XclSingleton instance = null;
	
	//synchronized 用於執行緒安全,防止多執行緒同時建立例項
	public synchronized static XclSingleton getInstance(){
		if(instance == null){
			instance = new XclSingleton();
		}	
		return instance;
	}	
	
	final HashMap<String, Object> mMap;
	private XclSingleton()
	{
		mMap = new HashMap<String,Object>();
	}
	
	public void put(String key,Object value){
		mMap.put(key,value);
	}
	
	public Object get(String key)
	{
		return mMap.get(key);
	}
	
}

 5.2 設定引數

		//通過單例模式傳引數的例子
		XclSingleton.getInstance().put("key1", "value1");
		XclSingleton.getInstance().put("key2", "value2");
		
		Intent intentSingleton = new Intent();				
		intentSingleton.setClass(MainActivity.this, 
								SingletonActivity.class); 			 		
		startActivity(intentSingleton); 

5.3 接收引數

this.setTitle("單例模式例子");		
		//接收引數
		HashMap<String,Object> map = XclSingleton.getInstance().mMap;			     			
		String sResult = "map.size() ="+map.size();		
		
		//遍歷引數
		Iterator iter = map.entrySet().iterator();
		while(iter.hasNext())
		{
			Map.Entry entry = (Map.Entry)iter.next();
			Object key = entry.getKey();
			Object value = entry.getValue();
			sResult +="\r\n key----> "+(String)key;
			sResult +="\r\n value----> "+(String)value;				
		}

  例子原始碼放在: 下載

MAIL:[email protected]

我的CSDN Blog:http://blog.csdn.net/xcl168

相關推薦

(轉)Android資料傳遞方法彙總

Android開發中,在不同模組(如Activity)間經常會有各種各樣的資料需要相互傳遞,我把常用的幾種方法都收集到了一起。它們各有利弊,有各自的應用場景。我現在把它們集中到一個例子中展示,在例子中每一個按紐代表了一種實現方法。1. 利用Intent物件攜帶簡單資料利用In

Android資料傳遞方法彙總

       Android開發中,在不同模組(如Activity)間經常會有各種各樣的資料需要相互傳遞,我把常用的幾種 方法都收集到了一起。它們各有利弊,有各自的應用場景。我現在把它們集中到一個例子

Android資料儲存方式之SQLite資料庫儲存 載入SD卡資料庫 sql操作 事務 防止SQL注入

資料庫 前言 資料庫儲存 資料庫建立 內建儲存資料庫 外接儲存資料庫 編寫DAO 插入操作 更新操作 刪除操作 查詢操作

Android資料儲存方式之檔案儲存 內部儲存 外部儲存 檔案讀取儲存操作封裝

檔案儲存 前言 檔案儲存 記憶體 內部儲存 外部儲存 內部儲存操作 API 讀寫操作 外部儲存操作 公共目錄 私有目錄

Android資料儲存方式

1、分類 資料儲存在開發中是使用最頻繁的,Android平臺中實現資料儲存主要有5種方式,分別是: SQLite: SQLite是一個輕量級嵌入式資料庫,支援基本SQL語法,是常被採用的一種資料儲存方式。Android為此資料庫提供了一個名為SQLiteDatabase的類,

綜述種類:Android元件之間 資料傳遞方法

部落格時間:2012-06-06 18:27 ------------------------------------------- 思路 1通過共享appication做處理 2 先轉換成json,第二個activity再轉換回list3 Parcelable S

Android隱藏狀態列和標題欄的方法(隱藏狀態列、標題欄方法彙總

方法一: public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(sav

16常用的資料分析方法彙總

經常會有朋友問到一個朋友,資料分析常用的分析方法有哪些,我需要學習哪個等等之類的問題,今天資料分析精選給大家整理了十六種常用的資料分析方法,供大家參考學習。 一、描述統計 描述性統計是指運用製表和分類,圖形以及計筠概括性資料來描述資料的集中趨勢、離散趨勢、偏度、峰度。 1、缺失值

Android中常用的資料儲存方式

第一種: 使用SharedPreferences儲存資料 適用範圍: 儲存少量的資料,且這些資料的格式非常簡單:字串型、基本型別的值。比如應用程式的各種配置資訊(如是否開啟音效、是否使用震動效果、小遊戲的玩家積分等),解鎖口 令密碼等 核心原理: 儲存基

php 資料加密可解密方法,部分還支援中文

<?php class Tool { private $key = "rtwertwerwg47878"; //可以自定義 public function setKey($key = NULL) { $this->key = (! $key) ? $th

回歸方法的比較

int port 數據集 pair 條目 如果 imp smo 假設  引言  線性和邏輯回歸通常是人們為機器學習和數據科學學習的第一個建模算法。 兩者都很棒,因為它們易於使用和解釋。 然而,它們固有的簡單性也有一些缺點,在許多情況下它們並不是回歸模型的最佳選擇。 實際

深度學習之影象的資料增強方法彙總

參考:https://www.jianshu.com/p/99450dbdadcf 在深度學習專案中,尋找資料花費了相當多的時間。但在很多實際的專案中,我們難以找到充足的資料來完成任務。為了要保證完美地完成專案,有兩件事情需要做好:1、尋找更多的資料;2、資料增強。本篇主要描述資料增強。 有

開啟運維之路之第 6 篇——Redis資料型別string、list、hash、set、zset

1、上一篇介紹Redis的基礎,提供2種啟動方式,這裡彙總一下: ①寫 shell 指令碼,執行 shell 指令碼。詳見上一篇文章結尾。 ②[[email protected] ~]# cd /usr/local/redis/ [[email protected

Android 旋轉Bitmap方法

原文地址:https://www.cnblogs.com/exmyth/p/4632700.html 旋轉有兩種方案,一種是旋轉控制元件,還有一種是在旋轉bitmap 旋轉bitmap有兩種方式 Android兩種 旋轉Bitmap方法 方法1. 利用Bitmap.createBit

數字格式化方法 新增逗號 , 分割

<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>五種數字格式化方法 新增逗號 , </title>

Redis 常用的資料型別和操作

第一部分:五種型別的基礎操作 (文章分為兩部分,基礎操作和詳細操作)   一、Redis 字串(String) Redis 字串資料型別的相關命令用於管理 redis 字串值,基本語法如下: 語法 redis 127.0.0.1:6379> COMMAND K

Redis學習筆記(一)---Redis的資料型別的簡單介紹和使用

1.準備工作:     1.1在Linux下安裝Redis    https://www.cnblogs.com/dddyyy/p/9763098.html    1.2啟動Redis     先把root/redis的redis.conf放到 /usr/local/redis/

redis資料型別及必須掌握的指令

一、redis五種資料型別 1.string(字串) string是redis最基本的型別,你可以理解成與Memcached一模一樣的型別,一個key對應一個value。 string型別是二進位制安全的。意思是redis的string可以包含任何資料。比如jpg圖片或者序列化的物件 。 s

Redis的資料結構及其常見命令

        Redis可以儲存鍵值與5種不同資料結構型別之間的對映。5種資料結構分別為字串(STRING)、連結串列(LIST)、無序列表(SET)、散列表(HASH)和有序列表(ZSET). 1.STRING(字串)    

【Redis】Redis資料庫及資料型別圖解

目錄 Redis資料庫: 是什麼? 優勢? 資料型別(五種): 1.字串: 2.hash型別: 3.list型別: 4.set型別: 5.zset型別: Redis資料庫: 是什麼? 一類新出現的,非關係型的,不支援SQL語法的,不支援事物,|