Intent是安卓開發(fā)里一個(gè)比較常用的對(duì)象坛增,最簡(jiǎn)單的我們可以用它來開啟一個(gè)activity或service磕瓷,或者發(fā)送一個(gè)廣播腥椒,在同一個(gè)進(jìn)程應(yīng)用里虽惭,Intent可以說是安卓四大組件之間溝通的橋梁。
對(duì)于這些熟悉的用法接谨,這里不做贅述摆碉,這篇目的主要說下Intent的需要注意的一個(gè)地方,那就是對(duì)于Intent攜帶數(shù)據(jù)的問題脓豪。
1. 可以攜帶哪些數(shù)據(jù)巷帝?
我們都知道Intent可以攜帶數(shù)據(jù),那么究竟可以攜帶哪些數(shù)據(jù)呢扫夜。
從圖上可以看出楞泼,Intent可以傳遞基本的數(shù)據(jù)類型,以及實(shí)現(xiàn)了Serializable和Parcelable接口的數(shù)據(jù)笤闯。
2. 為什么是這些數(shù)據(jù)類型堕阔?
Intent作為數(shù)據(jù)傳輸?shù)妮d體,不止可以實(shí)現(xiàn)進(jìn)程內(nèi)通信颗味,也可以實(shí)現(xiàn)進(jìn)程間通信超陆,進(jìn)程間通信的最終都是通過二進(jìn)制數(shù)據(jù)進(jìn)行傳輸?shù)模敲淳鸵笏鶖y帶的數(shù)據(jù)是可以進(jìn)行二進(jìn)制讀寫的浦马,這點(diǎn)可以參照AIDL的實(shí)現(xiàn)方式时呀。
所以對(duì)應(yīng)的數(shù)據(jù)類型张漂,就只有上面列出的那些,八大基本數(shù)據(jù)類型以及實(shí)現(xiàn)了Serializable和Parcelable接口的數(shù)據(jù)谨娜。
3. Intent攜帶數(shù)據(jù)的大小有沒有限制航攒?
肯定有限制,但不是以訛傳訛的40k趴梢,我們可以做個(gè)試驗(yàn)漠畜,最簡(jiǎn)單的使用Intent在activity之間傳遞一個(gè)Bitmap。
具體的測(cè)試過程就不貼了盆驹,直接說結(jié)論:Intent對(duì)數(shù)據(jù)的大小是有限制的圆丹,超過了會(huì)報(bào)錯(cuò)滩愁,這個(gè)數(shù)據(jù)的大小限制在500kb左右,當(dāng)然是比40k要大的多的辫封,但是這也不能成為我們用Intent來傳遞大體積數(shù)據(jù)的理由硝枉,之前在項(xiàng)目中遇到過使用Intent來傳遞一個(gè)接口返回List對(duì)象,在測(cè)試環(huán)境未出現(xiàn)問題倦微,切到線上環(huán)境才發(fā)現(xiàn)大量奔潰妻味,究其原因是因?yàn)闇y(cè)試數(shù)據(jù)量并沒有達(dá)到Intent的限制,但線上環(huán)境數(shù)據(jù)量則明顯超過500k了欣福,作為一個(gè)程序員來說责球,還是不可以心存僥幸,或者說這樣的用法完全是應(yīng)該禁止的拓劝。
4. 如果啟動(dòng)一個(gè)activity的時(shí)候一定要傳遞大體積的數(shù)據(jù)怎么辦雏逾?
這是一個(gè)很多人都遇到過的問題,解決辦法也是各式各樣郑临,最簡(jiǎn)單的方式有用Application傳遞的栖博,有用單例傳遞的,實(shí)現(xiàn)原理都差不多厢洞。下面貼出我自己的實(shí)現(xiàn)方式仇让。
public class IntentHelper {
private IntentHelper(){}
private static IntentHelper instance; //單例
private Map<String, Object> dataPool = new HashMap<>(); //存放數(shù)據(jù)
public static IntentHelper getInstance(){
if(instance == null){
synchronized (IntentHelper.class){
if(instance == null)
instance = new IntentHelper();
}
}
return instance;
}
/**
* 暫存要傳遞的數(shù)據(jù)
* @param key
* @param data
*/
public void put(String key, Object data){
dataPool.put(key, data);
}
/**
* 獲取
* @param key
* @return
*/
public Object get(String key){
return dataPool.get(key);
}
/**
* 傳遞完成后從map中移除掉
* @param key
*/
public void release(String key){
dataPool.remove(key);
}
}
存儲(chǔ):
Intent intent = new Intent(MainActivity.this, TestWebViewActivity.class);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.ic_deal);
Log.e("Versys","圖片的大小是 : "+bitmap.getByteCount()/1024+"kb");
String key = UUID.randomUUID().toString(); //建議key使用uuid
IntentHelper.getInstance().put(key, bitmap);
intent.putExtra("key", key);
startActivity(intent);
獲取:
String key = getIntent().getStringExtra("key");
Bitmap bitmap = (Bitmap) IntentHelper.getInstance().get(key);
IntentHelper.getInstance().release(key); //獲取到之后從單例的map中移除躺翻,防止內(nèi)存泄漏
總結(jié):
到這里關(guān)于Intent數(shù)據(jù)傳遞方面的就說的差不多了讶泰,希望能給大家在工作中或是面試的時(shí)候帶來幫助甲雅。