Android Activity之間傳遞數(shù)據(jù)的幾種方法

從一個(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.putExtrasBundle傳入:

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):putParcelableArrayListgetParcelableArrayList

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();

這樣就舒服多了

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,739評論 6 534
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,634評論 3 419
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,653評論 0 377
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,063評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,835評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,235評論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,315評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,459評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,000評論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,819評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,004評論 1 370
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,560評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,257評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,676評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,937評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,717評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,003評論 2 374

推薦閱讀更多精彩內(nèi)容

  • 1、Intent 可以傳遞的數(shù)據(jù)類型 在 Intent和IntentFilters(1) 中我們知道了通過 Int...
    CnPeng閱讀 2,811評論 0 10
  • 【Android Activity】 什么是 Activity? 四大組件之一,通常一個(gè)用戶交互界面對應(yīng)一個(gè) ac...
    Rtia閱讀 3,834評論 3 18
  • 面試題總結(jié) 通用 安卓學(xué)習(xí)途徑, 尋找資料學(xué)習(xí)的博客網(wǎng)站 AndroidStudio使用, 插件使用 安卓和蘋果的...
    JingBeibei閱讀 1,706評論 2 21
  • 我對數(shù)字,時(shí)間真的是一點(diǎn)概念都沒有.學(xué)習(xí)了5分鐘商學(xué)院才知道我好多的時(shí)間都沒有利用好白白的浪費(fèi)掉.比如說工作中要資...
    許瀛心閱讀 137評論 0 0
  • 鄭海燕焦點(diǎn)初級十期堅(jiān)持分享第72天2018.8.22 今天我和孩子一起去公園里的假山玩,假山上有很多大樹,風(fēng)很大,...
    晴嵐85閱讀 107評論 0 0