您现在的位置是:Instagram刷粉絲, Ins買粉絲自助下單平台, Ins買贊網站可微信支付寶付款 > 

03 消息訂閱與發布和eventbus(android broadreceiver 運行在哪個進程)

Instagram刷粉絲, Ins買粉絲自助下單平台, Ins買贊網站可微信支付寶付款2024-05-17 06:58:46【】5人已围观

简介1//registerReceiver(mBroadcastReceiver,intentFilter);2//注冊應用內廣播接收器3localBroadcastManager=LocalBroadc

1 //registerReceiver(mBroadcastReceiver, intentFilter);

2 //注冊應用內廣播接收器

3 localBroadcastManager = LocalBroadcastManager.getInstance(this);

4 localBroadcastManager.registerReceiver(mBroadcastReceiver, intentFilter);

5        

6 //unregisterReceiver(mBroadcastReceiver);

7 //取消注冊應用內廣播接收器

8 localBroadcastManager.unregisterReceiver(mBroadcastReceiver);

9

10 Intent intent = new Intent();

11 intent.setAction(BROADCAST_ACTION);

12 intent.putExtra("name", "qqyumidi");

13 //sendBroadcast(intent);

14 //發送應用內廣播

15 localBroadcastManager.sendBroadcast(intent);

 

4.不同注冊方式的廣播接收器回調onReceive(買粉絲ntext, intent)中的買粉絲ntext具體類型

1).對于靜態注冊的ContextReceiver,回調onReceive(買粉絲ntext, intent)中的買粉絲ntext具體指的是ReceiverRestrictedContext;

2).對于全局廣播的動態注冊的ContextReceiver,回調onReceive(買粉絲ntext, intent)中的買粉絲ntext具體指的是Activity Context;

3).對于通過LocalBroadcastManager動態注冊的ContextReceiver,回調onReceive(買粉絲ntext, intent)中的買粉絲ntext具體指的是Application Context。

注:對于LocalBroadcastManager方式發送的應用內廣播,只能通過LocalBroadcastManager動態注冊的ContextReceiver才有可能接收到(靜態注冊或其他方式動態注冊的ContextReceiver是接收不到的)。

 

5.不同Android API版本中廣播機制相關API重要變遷

1).Android5.0/API level 21開始粘滯廣播和有序粘滯廣播過期,以后不再建議使用;

2).”靜態注冊的廣播接收器即使app已經退出,主要有相應的廣播發出,依然可以接收到,但此種描述自Android 3.1開始有可能不再成立“

Android 3.1開始系統在Intent與廣播相關的flag增加了參數,分別是FLAG_INCLUDE_STOPPED_PACKAGES和FLAG_EXCLUDE_STOPPED_PACKAGES。

FLAG_INCLUDE_STOPPED_PACKAGES:包含已經停止的包(停止:即包所在的進程已經退出)

FLAG_EXCLUDE_STOPPED_PACKAGES:不包含已經停止的包

主要原因如下:

自Android3.1開始,系統本身則增加了對所有app當前是否處于運行狀態的跟蹤。在發送廣播時,不管是什么廣播類型,系統默認直接增加了值為FLAG_EXCLUDE_STOPPED_PACKAGES的flag,導致即使是靜態注冊的廣播接收器,對于其所在進程已經退出的app,同樣無法接收到廣播。

詳情參加Android官方文檔:買粉絲://developer.android.買粉絲/about/versions/android-3.1.買粉絲#launch買粉絲ntrols

由此,對于系統廣播,由于是系統內部直接發出,無法更改此intent flag值,因此,3.1開始對于靜態注冊的接收系統廣播的BroadcastReceiver,如果App進程已經退出,將不能接收到廣播。

但是對于自定義的廣播,可以通過復寫此flag為FLAG_INCLUDE_STOPPED_PACKAGES,使得靜態注冊的BroadcastReceiver,即使所在App進程已經退出,也能能接收到廣播,并會啟動應用進程,但此時的BroadcastReceiver是重新新建的。

1 Intent intent = new Intent();

2 intent.setAction(BROADCAST_ACTION);

3 intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);

4 intent.putExtra("name", "qqyumidi");

5 sendBroadcast(intent);

注1:對于動態注冊類型的BroadcastReceiver,由于此注冊和取消注冊實在其他組件(如Activity)中進行,因此,不受此改變影響。

注2:在3.1以前,相信不少app可能通過靜態注冊方式監聽各種系統廣播,以此進行一些業務上的處理(如即時app已經退出,仍然能接收到,可以啟動service等..),3.1后,靜態注冊接受廣播方式的改變,將直接導致此類方案不再可行。于是,通過將Service與App本身設置成不同的進程已經成為實現此類需求的可行替代方案。

做混合的話Uniapp和Flutter我應該學哪個啊?

本文由阿里閑魚技術團隊祈晴分享,本次有修訂和改動,感謝作者的技術分享。

1、內容概述

本文總結了阿里閑魚技術團隊使用Flutter在對閑魚IM進行移動端跨端改造過程中的技術實踐等,文中對比了傳統Native與現在大熱的Flutter跨端方案在一些主要技術實現上的差異,以及針對Flutter技術特點的具體技術實現,值得同樣準備使用Flutter開發IM的技術同行們借鑒和參考。

學習交流:

- 移動端IM開發入門文章:《新手入門一篇就夠:從零開發移動端IM》

- 開源IM框架源碼:買粉絲s://github.買粉絲/JackJiang2011/MobileIMSDK

(本文同步發布于:買粉絲://買粉絲.52im.買粉絲/thread-3615-1-1.買粉絲)

2、閑魚IM現狀

閑魚IM的移動端框架構建于2016至2017年間,期間經過多次迭代升級導致歷史包袱累積多,后面又經歷IM界面的Flutter化,從而造成了客戶端架構愈加復雜。

從開發層面總結閑魚IM移動端當前架構主要存在如下幾個問題:

1)研發效率較低:當前架構涉及到Android/iOS雙端的邏輯代碼以及Flutter的UI代碼,定位問題往往只能從Flutter UI表相倒查到Native邏輯層;2)架構層次較差:架構設計上分層不清晰,業務邏輯夾雜在核心的邏輯層致使代碼變更風險大;3)性能測試略差:核心數據源存儲Native內存,需經Flutter Plugin將數據源序列化上拋Flutter側,在大批量數據源情況下性能表現較差。

從產品層面總結閑魚IM移動端當前架構的主要問題如下:

1)定位問題困難:線上輿情反饋千奇百怪,測試始終無法復現相關場景,因此很多時候只能靠現象猜測本質;2)疑難雜癥較多:架構的不穩定性造成出現的問題反復出現,當前疑難雜癥主要包括未讀紅點計數、iPhone5C低端機以及多媒體發送等多個問題;3)問題差異性大:Android和iOS兩端邏輯代碼差異大,包括埋點邏輯都不盡相同,排查問題根源時雙端都會有不同根因,解決方案也不相同。3、業界的移動端跨端方案

為解決當前IM的技術痛點,閑魚今年特起關于IM架構升級項目,重在解決客戶端中Andriod和iOS雙端一致性的痛點,初步設想方案就是實現跨端統一的Android/iOS邏輯架構。

在當前行業內跨端方案可初步歸類如下圖架構:

在GUI層面的跨端方案有Weex、ReactNative、H5、Uni-APP等,其內存模型大多需要通過橋接到Native模式存儲。

在邏輯層面的跨端方案大致有C/C++等與虛擬機無關語言實現跨端,當然匯編語言也可行。

此外有兩個獨立于上述體系之外的架構就是Flutter和KMM(谷歌基于Kotlin實現類似Flutter架構),其中Flutter運行特定DartVM,將內存數據掛載其自身的isolate中。

考慮閑魚是Flutter的前沿探索者,方案上優先使用Flutter。然而Flutter的isolate更像一個進程的概念(底層實現非使用進程模式),相比Android,同一進程場景中,Android的Dalvik虛擬機多個線程運行共享一個內存Heap,而DartVM的Isolate運行隔離各自的Heap,因而isolate之間通訊方式比較繁瑣(需經過序列化反序列化過程)。

整個模型如下圖所示:

若按官方混合架構實現Flutter應用,開啟多個FlutterAcitivty/FlutterController,底層會生成多個Engine,對應會存在多個isolate,而isolate通訊類似于進程通訊(類似socket或AIDL),這里借鑒閑魚FlutterBoost的設計理念,FlutterIM架構將多個頁面的Engine共享,則內存模型就天然支持共享讀取。

原理圖如下:

4、閑魚IM基于Flutter的架構設計

4.1 新老架構對比

如下圖所示:是一個老架構方案,其核心問題主要集中于Native邏輯抽象差,其中邏輯層面還設計到多線程并發使得問題倍增,Android/iOS/Flutter交互繁雜,開發維護成本高,核心層耦合較為嚴重,無插拔式概念.

考慮到歷史架構的問題,演進如下新架構設計:

如上圖所示,架構從上至下依次為:

1)業務層;2)分發層;3)邏輯層;4)數據源層。

數據源層來源于推送或網絡請求,其封裝于Native層,通過Flutter插件將消息協議數據上拋到Flutter側的核心邏輯層,處理完成后變成Flutter DB的Enitity實體,實體中掛載一些消息協議實體。

核心邏輯層將繁雜數據扁平化打包掛載到分發層中的會話內存模型數據或消息內存模型數據,最后通過觀察者模式的訂閱分發到業務邏輯中。

Flutter IM重點集中改造邏輯層和分發層,將IM核心邏輯和業務層面數據模型進行封裝隔離,核心

很赞哦!(34728)

Instagram刷粉絲, Ins買粉絲自助下單平台, Ins買贊網站可微信支付寶付款的名片

职业:程序员,设计师

现居:河北省邯郸邯山区

工作室:小组

Email:[email protected]