從一個(gè)Activity中傳遞數(shù)據(jù)到另一個(gè)Activity中,有如下幾個(gè)方法:
- Intent
- Bundle
- Serializable
- Parcelable
首先設(shè)置一個(gè)Button,按下即可跳轉(zhuǎn)到下一個(gè)Activity;
方法1.intent.putExtra
傳遞一些簡單的數(shù)據(jù):
String s = "hello";
//目前Activity→目標(biāo)Activity
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
//加入intent
intent.putExtra("text",s);
//啟動
startActivity(intent);
在SecondActivity里接收數(shù)據(jù):
Intent intent = getIntent();
String s = intent.getStringExtra("text");
Log.d("Laze",s);
開始測試,點(diǎn)擊Button后看到日志:
putExtra
可以傳遞多種參數(shù):接收方法名稱不一樣
但是有規(guī)律,
get+[傳遞類型]+Extra
,非常簡單。
方法2.Bundle對象傳遞
將要傳入的值寫入Bundle
,再用intent.putExtras
把Bundle
傳入:
String s = "hello,world!";
Bundle bundle = new Bundle();
bundle.putString("data",s);
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtras(bundle);
startActivity(intent);
接收時(shí),先從Intent
中取出Bundle
,再從Bundle
中取出String
(或其他類型參數(shù)):
Intent intent = getIntent();
Bundle bundle = intent.getExtras();
String s = bundle.getString("data");
Log.d("Laze",s);
Intent傳值和Bundle的區(qū)別
Bundle
在存取數(shù)據(jù)是比較靈活的,而Intent
在存取數(shù)據(jù)的種類很少且沒有指定數(shù)據(jù)類型;
想對數(shù)據(jù)進(jìn)行比較靈活的操作如批量操作的話就用Bundle
;
Bundle
是可以對對象進(jìn)行操作的,而Intent
不可以。Bundle
相對于Intent
比較偏下層,比Intent
接口更多,更靈活,但Bundle
仍需要借助Intent
才能在Activity之間傳遞。
概括一下,Intent
旨在數(shù)據(jù)傳遞,bundle
旨在存取數(shù)據(jù),當(dāng)然Intent
也提供一部分?jǐn)?shù)據(jù)的存取,但比起Bundle
就顯得很不靈活。
當(dāng)然我還是喜歡用Intent,傳簡單數(shù)據(jù)的時(shí)候書寫量就少了啊 orz
用Bundle傳遞如ArrayList之類復(fù)雜的數(shù)據(jù)
這種原理是和上面一種是一樣的,只是要注意下。 在傳參數(shù)前,要用新增加一個(gè)List將對象包起來。
Map<String,Object> map = new HashMap<>();
map.put("key1","value1");
map.put("key2","value2");
List<Map<String,Object>> list = new ArrayList<>();
list.add(map);
Bundle bundle = new Bundle();
//須定義一個(gè)list用于在budnle中傳遞需要傳遞的ArrayList<Object>,這個(gè)是必須要的
ArrayList bundlelist = new ArrayList();
bundlelist.add(list);
bundle.putParcelableArrayList("list",bundlelist);
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtras(bundle);
startActivity(intent);
接收時(shí):
Bundle bundle = getIntent().getExtras();
ArrayList list = bundle.getParcelableArrayList("list");
List<Map<String,Object>> list1 = (List<Map<String, Object>>)list.get(0);
Log.d("Laze",list1.get(0).toString());
結(jié)果:
成功。
方法3.通過Serializable接口
利用Java語言本身的特性,通過將數(shù)據(jù)序列化后,再將其傳遞出去。
HashMap<String,String> map = new HashMap<String,String>();
map.put("key1","value1");
map.put("key2","value2xxx");
Bundle bundle = new Bundle();
bundle.putSerializable("serializable",map);
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtras(bundle);
startActivity(intent);
接收:
Bundle bundle = getIntent().getExtras();
HashMap<String,String> map = (HashMap<String,String>)bundle.getSerializable("serializable");
Log.d("Laze",map.toString());
查看日志:
再次成功~
方法4.Parcelable接口
這個(gè)是通過實(shí)現(xiàn)Parcelable
接口,把要傳的數(shù)據(jù)打包在里面,然后在接收端自己分解出來。這個(gè)是Android獨(dú)有的,在其本身的源碼中也用得很多,效率要比Serializable
相對要好。
但是他代碼量相對上面3種要多得多,對新手來說當(dāng)然是選擇Serializable
,眼尖的童鞋能看到上面也用到了點(diǎn):putParcelableArrayList
,getParcelableArrayList
。
Parcelable
的使用,這里是我在用我在用Serializable
時(shí)遇到了警告于是使用了Parcelable
。
總結(jié)
平時(shí)使用最多的還是直接用Intent直接傳值,這樣可以少寫兩行代碼(屈服于代碼量),必要的時(shí)候就會用其他的方法。當(dāng)我需要傳值的時(shí)候一般都是在一個(gè)list里面,然后就用到Parcelable
。
代碼簡寫:
Intent intent = new Intent();
intent.setClass(MainActivity.this, SecondActivity.class);
//寫為
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
Intent intent = getIntent();
Bundle bundle = intent.getExtras();
//寫為
Bundle bundle = getIntent().getExtras();
這樣就舒服多了