Android Activity數(shù)據(jù)回傳的一種另類實(shí)現(xiàn)

Android Activity數(shù)據(jù)回傳的一種另類實(shí)現(xiàn)

@(八千里路云和月)

[TOC]

業(yè)務(wù)場(chǎng)景描述

ActA啟動(dòng)了ActB, ActB會(huì)對(duì)數(shù)據(jù)進(jìn)行處理, ActB里面的數(shù)據(jù)可能會(huì)在ActC里面進(jìn)行進(jìn)一步的處理, 要求: C和B都要能夠給處理結(jié)果傳遞給ActA.

可能的實(shí)現(xiàn)方案

  1. startActivityForResult
    對(duì)于級(jí)聯(lián)的startActivityForResult, 我們需要設(shè)置FLAG_ACTIVITY_FORWARD_RESULT, 具體可以參考這篇博客](https://goo.gl/seVq9k)
    這個(gè)是最先想到的方案,嘗試了一下, 發(fā)現(xiàn)并不能解決問題, 原因也在Android doc 里面有說

    if the activity you are launching uses the singleTask launch mode, it will not run in your task and thus you will immediately receive a cancel result

  2. 使用BroadcastReceiver來進(jìn)行通訊.
    這個(gè)方案能夠解決問題, 大家很開心.
    由于一開始模塊沒有使用多進(jìn)程,我們實(shí)現(xiàn)上使用了LocalBroadcast, 之后我們使用了多進(jìn)程的方案, 然后這個(gè)LocalBroadcast廢了, 還好更新的BoradcastReceiver工作量也不大.

    使用該方案要注意BoradcastReceiver生命周期的管理: 使用onCreate/onDestory來進(jìn)行管理(總感覺怪怪的...).

  3. 使用其他進(jìn)程間通訊的方案

    1. Socket/LocalSocket
      ActA啟動(dòng)一個(gè)ServerSocket, ActB/ActC對(duì)數(shù)據(jù)修改時(shí), 將信息寫入到Socket里面, 這樣ActA就能實(shí)時(shí)的獲取數(shù)據(jù)的變更了.
      這個(gè)是典型的用牛刀, 不實(shí)用,但也是一個(gè)解決問題的思路.
    2. Service數(shù)據(jù)同步
      提供一個(gè)后臺(tái)服務(wù)(BackgroundService/BS), 數(shù)據(jù)修改時(shí), 告訴BS, ActA到BS里面進(jìn)行查詢結(jié)果.
      這個(gè)實(shí)現(xiàn)起來也太重,僅做參考.

第一種方案改進(jìn)(Evolution):

對(duì)于singleTask E1

EventBus提供了Sticky Event能夠規(guī)避這個(gè)問題.

Sticky Events
可以先發(fā)布后訂閱的事件, 具體可以參考官方的說明Sticky Events

由于EventBus不支持多進(jìn)程,因此, 該方案要繼續(xù)進(jìn)化.

多進(jìn)程支持 E2

由于E1 不支持多進(jìn)程, 因此 用E1+3.2(數(shù)據(jù)同步)就能夠解決問題了.
前提

應(yīng)用里面已經(jīng)有了跨進(jìn)程數(shù)據(jù)存儲(chǔ)的方案(DB)

因此我們只要實(shí)現(xiàn)數(shù)據(jù)的Cache/Retrieve就可以了.具體的實(shí)現(xiàn)如下

  1. 定義數(shù)據(jù)存儲(chǔ)的接口
//IRepository.java 定義數(shù)據(jù)的存取
Observable<List<StoreEventPO>> getCurrentUIEvents(String actionType);
Observable<StoreEventPO> saveUIEvent(final StoreEventPO event);
Observable<StoreEventPO> removeUIEvent(StoreEventPO event);

//StoreEventPO.java 定義要存取的事件的數(shù)據(jù)結(jié)構(gòu).
  1. ActB/ActC 更新數(shù)據(jù)時(shí), Cache行為事件
//Client: 事件的生產(chǎn)者 調(diào)用
saveUIAction{
    ...
    IRepository#saveUIEvent(StoreEventPO)
    ...
}
  1. ActA Retrieve 行為事件.
//Client: 事件的消費(fèi)者 
    @Override
    protected void onResume() {
        ...
        checkUIEvents();  
    }
    public void checkUIEvents() {
        IRepository#getCurrentUIEvents(EVENT_TYPE_XXX).logic...
    }

方案一演進(jìn)到E2就能夠解決業(yè)務(wù)場(chǎng)景的問題了, 該方案避免使用FLAG_ACTIVITY_FORWARD_RESULT這個(gè)復(fù)雜(對(duì)結(jié)果進(jìn)行forward)的字段

總結(jié)

遇到問題, 使用直接暴力的方式去解決, 發(fā)現(xiàn)在特殊的場(chǎng)景下(singleTask)撂挑子,然后思考怎樣解決該特殊的場(chǎng)景, 發(fā)現(xiàn)EventBus的Sticky Events(本質(zhì)是Cached Events)能夠解決當(dāng)下問題, 又引入了新問題(cross process), 結(jié)合項(xiàng)目的具體實(shí)現(xiàn)(數(shù)據(jù)存儲(chǔ)能夠 cross process)最終演進(jìn)到能夠解決問題的方案.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市讼呢,隨后出現(xiàn)的幾起案子踪央,更是在濱河造成了極大的恐慌丰包,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡双抽,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門闲礼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來牍汹,“玉大人,你說我怎么就攤上這事柬泽∩鞣疲” “怎么了?”我有些...
    開封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵锨并,是天一觀的道長(zhǎng)露该。 經(jīng)常有香客問我,道長(zhǎng)第煮,這世上最難降的妖魔是什么解幼? 我笑而不...
    開封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮包警,結(jié)果婚禮上撵摆,老公的妹妹穿的比我還像新娘。我一直安慰自己害晦,他們只是感情好特铝,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著壹瘟,像睡著了一般鲫剿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上稻轨,一...
    開封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天牵素,我揣著相機(jī)與錄音,去河邊找鬼澄者。 笑死,一個(gè)胖子當(dāng)著我的面吹牛请琳,可吹牛的內(nèi)容都是我干的粱挡。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼俄精,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼询筏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起竖慧,我...
    開封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤嫌套,失蹤者是張志新(化名)和其女友劉穎逆屡,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體踱讨,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡魏蔗,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了痹筛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片莺治。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖帚稠,靈堂內(nèi)的尸體忽然破棺而出谣旁,到底是詐尸還是另有隱情,我是刑警寧澤滋早,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布榄审,位于F島的核電站,受9級(jí)特大地震影響杆麸,放射性物質(zhì)發(fā)生泄漏搁进。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一角溃、第九天 我趴在偏房一處隱蔽的房頂上張望拷获。 院中可真熱鬧,春花似錦减细、人聲如沸匆瓜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽驮吱。三九已至,卻和暖如春萧吠,著一層夾襖步出監(jiān)牢的瞬間左冬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工纸型, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拇砰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓狰腌,卻偏偏與公主長(zhǎng)得像除破,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子琼腔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

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