一個(gè)SingleTask與跳轉(zhuǎn)傳值引發(fā)的血案

此文原來是自己CSDN上的第一篇博客,因個(gè)人需要甩栈,將其復(fù)制到簡(jiǎn)書平臺(tái),另一方面也希望此文可以給安卓初學(xué)者在Activity啟動(dòng)模式中SingleTask模式下的傳值提供思路參考糕再,文風(fēng)拙劣量没,歡迎指導(dǎo)。
原文地址:
http://blog.csdn.net/wj_november/article/details/49851117

最近在做項(xiàng)目中遇到這樣一個(gè)情況:

  • Activity A跳轉(zhuǎn)到Activity B突想,Activity A設(shè)置為launchMode:singleTask
  • Activity B有一個(gè)ListView殴蹄,點(diǎn)擊ListView的一項(xiàng),返回到Activity A中猾担,同時(shí)傳值點(diǎn)擊的是那一項(xiàng)(見圖:1-1饶套,代碼:onItemClick)
  • 然后在Activity B中Log出返回的值,但是無論如何就是獲取不到(見代碼:getBundle垒探,見圖:1-2)
圖1-1

onItemClick

@Override  
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {  
    Intent intent = new Intent(BActivity.this, AActivity.class);  
    Bundle bundle = new Bundle();  
    bundle.putString(StaticValues.KEY_CAR_SERIES, seriesList.get(position));  
    bundle.putInt(StaticValues.KEY_CAR_SERIES_ID, position);  
    intent.putExtras(bundle);  
    startActivity(intent);  
    finish();  
}  

getBundle

private void getBundle() {  
    Bundle bundle = MainActivity.this.getIntent().getExtras();  
    if (null != bundle) {  
        Log.d("car", "bundle not null");  
        int carSeriesId = bundle.getInt(StaticValues.KEY_CAR_SERIES_ID);  
        String carSeries = bundle.getString(StaticValues.KEY_CAR_SERIES);  
        Log.d("car", carSeries + "--id=" + carSeriesId);  
    } else {  
        Log.d("car", "bundle null");  
    }  
}  
圖1-2

后來想到妓蛮,Activity A使用了SingleTask的launchMode,猜想可能跟這個(gè)有關(guān)圾叼,在執(zhí)行界面跳轉(zhuǎn)的時(shí)候蛤克,不會(huì)生成新的Activity A實(shí)例,所以可能不會(huì)接收到傳過來的Bundle里面的值夷蚊。于是將Activity A的launchMode改為了Standard构挤,果然,B傳過來的值惕鼓,A可以接收到(見圖:1-3)筋现,驗(yàn)證了我的猜想。

圖1-3

但是為什么使用了SingleTask就不能接收到Bundle的傳值呢箱歧?
帶著疑問矾飞,我們打開了Google API的官網(wǎng),找到了問題所在呀邢,罪魁禍?zhǔn)拙褪莋etIntent().我們現(xiàn)在看看我們使用的SingleTask:

圖1-4

The system creates the activity at the root of a new task and routes the intent to it. However, if an instance of the activity already exists, the system routes the intent to existing instance through a call to its onNewIntent() method, rather than creating a new one.

大致意思就是說一個(gè)Activity B如果跳轉(zhuǎn)到另一個(gè)launchMode為SingleTask的Activity A時(shí)洒沦,如果task里面已經(jīng)有Activity A,那么跳轉(zhuǎn)時(shí)只需要調(diào)用它里面的onNewIntent()方法价淌,而不是另外創(chuàng)建一個(gè)新的Activity A.

那么onNewIntent()到底是什么申眼?如何使用它呢?
帶著好奇蝉衣,我們來查詢onNewIntent()這個(gè)方法:

圖1-5

onNewIntent() will be called on the existing instance with the Intent that was used to re-launch it.

這句話的大致意思是說括尸,如果你的Task里面已經(jīng)有Activity A實(shí)例,且其他其他界面跳轉(zhuǎn)到A時(shí)不會(huì)產(chǎn)生新的A的實(shí)例時(shí)病毡,onNewIntent()會(huì)被調(diào)用濒翻,通常這時(shí)候這里面的Intent是用來重新啟動(dòng)那個(gè)已經(jīng)存在的A實(shí)例的。

An activity will always be paused before receiving a new intent, so you can count on onResume() being called after this method.

我們的Activity A在接收到一個(gè)新的Intent的時(shí)候剪验,會(huì)被pause掉肴焊,所以我們?cè)谡{(diào)用onNewIntent()的時(shí)候前联,記得在之后調(diào)用onResume().(雖然讀清楚了字面意思,但是還是不知道具體怎么操作-_-#)

這里我們注意一下這句話:

Note that getIntent() still returns the original Intent. You can use setIntent(Intent) to update it to this new Intent.

我們之前在getBundle()方法里(見上面代碼:getBundle)調(diào)用的是getIntent()方法娶眷,這個(gè)方法返回的是最原始啟動(dòng)Actvity A的Intent似嗤,而不是由Activity B跳轉(zhuǎn)到Activity A使用的Intent。所以我們想要拿到Activity B跳到Activity A使用的Intent届宠,我們要使用setIntent(Intent)方法烁落。

那么我們?nèi)绾问褂胹etIntent(Intent)呢?
由上述表達(dá)的意思豌注,我們隱約可以理解伤塌,setIntent(Intent)在onNewIntent(Intent)里面,那么setIntent方法的參數(shù)無疑使用的也是onNewIntent的參數(shù)轧铁∶看希可是onNewIntent(Intent)方法是如何調(diào)用的呢?我們回到了上一個(gè)問題齿风。于是帶著思考药薯,我們?nèi)ザ饶锪艘幌拢Y(jié)果找到了這樣的代碼:

@Override  
protected void onNewIntent(Intent intent) {  
    super.onNewIntent(intent);  
    setIntent(intent);  
} 

表達(dá)的意思和上述onNewIntent的英文解釋一樣救斑,當(dāng)有一個(gè)Activity B跳轉(zhuǎn)到我們的singleTask Activity A時(shí)童本,我們?cè)趃etIntent()前會(huì)先執(zhí)行onNewIntent()方法,在這個(gè)方法里脸候,我們將接收到的新的Intent覆蓋了第一次啟動(dòng)Activity A用的Intent穷娱,這樣我們?cè)趃etIntent()的時(shí)候,拿到的Intent就是帶有B傳給A帶有Bundle值的Intent了运沦。
我們將onNewIntent(Intent)方法寫在了我們的Activity A里面泵额,成功的得到了B傳給A的數(shù)據(jù)(效果如圖:1-3)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末茶袒,一起剝皮案震驚了整個(gè)濱河市梯刚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌薪寓,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件澜共,死亡現(xiàn)場(chǎng)離奇詭異向叉,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)嗦董,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來京革,“玉大人奇唤,你說我怎么就攤上這事幸斥。” “怎么了咬扇?”我有些...
    開封第一講書人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵甲葬,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我懈贺,道長(zhǎng)经窖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任梭灿,我火速辦了婚禮画侣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘堡妒。我一直安慰自己配乱,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開白布皮迟。 她就那樣靜靜地躺著宪卿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪万栅。 梳的紋絲不亂的頭發(fā)上佑钾,一...
    開封第一講書人閱讀 51,521評(píng)論 1 304
  • 那天,我揣著相機(jī)與錄音烦粒,去河邊找鬼休溶。 笑死,一個(gè)胖子當(dāng)著我的面吹牛扰她,可吹牛的內(nèi)容都是我干的兽掰。 我是一名探鬼主播,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼徒役,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼孽尽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起忧勿,我...
    開封第一講書人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤杉女,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后鸳吸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體熏挎,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年晌砾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了坎拐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖哼勇,靈堂內(nèi)的尸體忽然破棺而出都伪,到底是詐尸還是另有隱情,我是刑警寧澤积担,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布陨晶,位于F島的核電站,受9級(jí)特大地震影響磅轻,放射性物質(zhì)發(fā)生泄漏珍逸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一聋溜、第九天 我趴在偏房一處隱蔽的房頂上張望谆膳。 院中可真熱鬧,春花似錦撮躁、人聲如沸漱病。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽杨帽。三九已至,卻和暖如春嗤军,著一層夾襖步出監(jiān)牢的瞬間注盈,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來泰國打工叙赚, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留老客,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓震叮,卻偏偏與公主長(zhǎng)得像胧砰,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子苇瓣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

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