當前位置:首頁 » 安卓系統 » android傳遞

android傳遞

發布時間: 2023-01-14 13:13:30

① Android跨進程傳遞大數據

最近要從 Service 端給 Client 端傳遞圖片數據,之前的數據都是通過 aidl 傳遞:
創建 Parcelable 文件
ImageData.java

test.aidl

運行報錯:

這里導致 DeadObjectException 的原因主要是 binder 創建的 buffer 被占滿了:

傳輸中如果數據大於 free_buffers ,則會拋出 DeadObjectException

socke 傳輸不受大小限制,但實現比較復雜

通過文件傳輸比較簡單,但效率差,而且高版本會受到Android系統許可權限制

將較大數據切割成較小的數據傳輸,此方法是兼顧效率,復雜度較好的方案

定義數據體:

切割數據方法:

將ImageData按順序構建發送:

client接收:

binder 本身也是利用 mmap ,可以利用實現 mmap 的框架,比如 MMKV

如果傳輸的數據是 Bitmap ,還可以用 Bundle 的 putBinder 方案
定義 binder :

發送

接收:

② Android 點擊回調傳遞

在使用MultiTypeAdapter實現RecyclerView多類型顯示的時候,會創建一個ViewHolder和ViewBinder,此時如果要在Activity或者Fragment相應點擊事件的時候,需要在ViewHolder和ViewBinder之間做傳遞。如果一個ViewHolder下有RecyclerView,然後也使用了MultiTypeAdapter,那麼這個點擊事件的回調將會是一件相當頭疼的事情。

在使用 LifeCycle 時,發現他只需要當前類實現 LifecycleObserver ,然後通過調用 addObserver 方法即可實現事件傳遞。由此想到點擊事件是否也可以使用此種形式來實現。

DEMO

在受到 LifeCycle 的啟發下,模仿這寫了幾個類。

一個點擊事件如果在某個類中如果需要做操作,那麼需要實現該介面。

繼承OnItemClick,並實現具體的方法。

基本點擊事件Observer

這一層,對事件在OnBindViewHolder中做了一次傳遞,通過dispatchObserver方法,將ViewBinder中的事件傳遞到了ViewHolder中。

定義兩個點擊事件。

創建實體類,和Binder相對應。

在覆寫 setData 方法的時候,一定要調用super。不然事件無法傳遞。

響應事件的回調,只需要調用 getObserver 方法,然後傳入對應的Observer,如果有,就直接調用方法。

adapter傳遞事件,也是通過dispatchObserver方法。

ViewBinder其實就不需要做什麼事情了,比較簡單。

③ Android消息傳遞用什麼好

這個首先要看你在什麼場景下做消息傳遞,咱要具體問題具體分析:

  1. Activity與Activity,調用啟動方法的時候傳遞即可

  2. Activity與Fragment,使用Bundle傳遞;

  3. Activity與Service,使用onBind進行消息傳遞

  4. 介面回調

  5. BroadCast方式傳遞數據

  6. EventBus方式傳遞數據

  7. 觀察者模式傳遞數據

比較常用的是1、2、3、4;基本滿足要求了,如果還無法達到要求酌情使用5、6、7;

④ Android Intent傳遞大量數據造成頁面卡頓,閃退的解決方案

        我們知道在Activity間使用Intent傳遞List含有大量序列化的對象的時候,或者傳遞較大bitmap等較大量數據的時候會引起頁面卡頓。而且Android本身也限制了能夠傳遞的數據大小在1MB左右。這就要求我們不得不為傳輸大量數據尋求一個解決方法。

        通常我們可以想到的一個方法是當從A頁面跳轉至B頁面的時候將需要傳遞的大對象賦值給A頁面的一個靜態變數,在B頁面去取A頁面的值。這種方式簡單卻有很多問題,比如可能會有很多其他頁面訪問B頁面這會導致靜態變數管理混亂,而且如果在組件化開發的過程中,需要進行組件間跳轉的時候只能把這種靜態變數寫在BaseLibrary中,這顯然是不夠友好的。

        我們稍加處理做一個簡單的封裝。++參考:《Android工程化最佳實踐》++

        就這樣簡單的兩個類我們就完成了封裝,可以看到在Model中序列化了一個int值。下面我們來看一個簡單的使用示例:

        通過以上方式的封裝,可以看到無論需要序列化傳遞的對象有多大,在傳值的時候只是傳遞了一個「int」而已。使用該這種方法時需要注意的一點是在數據的接收頁面只能使用getIntent()獲取一次該對象的值,因為我們在取完一次值後便將該對象從緩存區移除了。

⑤ android傳遞大數據

主要就是通過 弱引用 來實現,數據的保存和讀取,不通過Intent傳遞數據

⑥ Android 點擊事件傳遞(簡單版)

Android點擊事件的傳遞應該是屬於「必考題」這一類型的了, 當然了解這一塊對於平常開發也非常的有用。例如:滾動事件沖突的解決、自定義控制項點擊效果等。本篇就簡單的來捋一下 Android的點擊事件

Demo很簡單,就是最外層是一個Activity 然後自定了一個ViewGroup 和 View

不可點擊
通過Log可以看出 ACTION_DOWN 事件是從 Activity->ViewGroup->View->ViewGroup->Activity 中間沒有事件消費 所以又返回到了Activity。 由於ACTION_DOWN事件沒有消費 所以ACTION_UP不會再給你消費的機會

可點擊 其他沒有任何操作
根據Log可以看出事件是從最外層傳入最底層,當最底層的View給消費後將不再返回

InterceptTouchEvent ACTION_DOWN返回為false,ACTION_UP 返回為true ,則View的 dispatchTouchEvent 和 TouchEvent會調用 ACTION_CANCEl

dispatchTouchEvent中 ACTION_DOWN 返回為false 其他返回為true

附上Demo地址: https://github.com/i-show/demos-AndroidView

⑦ Android事件傳遞

-> 觸摸屏幕出發硬體驅動

-> 產生原生態的內核事件

-> Linux內核講事件包裝為通用的Event存到/dev/input/event[x]目錄下

當系統啟動時,SystemServer進程會啟動一些列的系統服務,如AMS,WMS等,包括InputManagerService。

作用:與硬體通信,接收屏幕輸入事件。
內部啟動了一個InputReader讀線程,從到/dev/input/目錄拿到事件
InputReader將事件分發給InputDispatcher線程,進行統一的事件分發調度
IMS通過InputChannel進程間通訊(socket)將事件傳遞給應用進程
InputChannel在ViewRootImpl.setView時,進行了注冊
當應用進程接收到消息,通過native回調到InputEventReceiver.dispachInputEvent -> ViewRootImpl
當時間分發完成後,會調用finishInputEvent,告知InputDispatcher將事件移除,完成本次事件分發

-> 驅動
-> IMS
-> InputEventReceiver
-> ViewRootImpl
-> DecorView(dispatchInputEvent)
-> Activity(dispatchInputEvent)
-> PhoneWindow(superDispatchTouchEvent)
-> DecorView(父類ViewGroup的dispatchInputEvent)
-> 分發給子View
-> 回到ViewRootImpl,結束事件分發

文字描述:
1.驅動響應事件並包裝為Event
2.通過InputManagerService將Event傳遞到應用進程
3.通過native回調到InputEventReceiver
4.ViewRootImpl注冊了InputChannel及InputEventReceiver,所以可以接收到事件,
收到事件後,傳遞給DecorView.dispatchInputEvent,這里使用到了責任鏈模式
5.DecorView調用Activity.dispatchInputEvent
6.Activity調用PhoneWindow.superDispatchTouchEvent
7.PhoneWindow調用DecorView.superDispatchTouchEvent
8.DecorView調用父類super.dispatchInputEvent
9.當沒有子View消費,會調用Activity.onTouchEvent()
10.不管有沒有子View消費,都會回到ViewRootImp,然後將事件移除,結束這次事件分發

RecyclerView的手勢Down、Move、Up的分發,item的點擊事件分發邏輯

1.RecyclerView收到Down事件,由於子View沒有請求攔截事件(disallowIntercept為false),所以會判斷是否由自身攔截事件(onInterceptTouchEvent)

2.由於Down事件沒有觸發RecyclerView的滾動,所以沒有攔截(onInterceptTouchEvent返回false),事件會繼續往下分發到子View(dispatchTouchEvent)

3.子View的dispatchTouchEvent會將事件流轉到onTouchEvent,由於子View設置了點擊事件,所以onTouchEvent返回true表示進行消費

4.RecyclerView的Down事件分發,有子View產生消費,所以mFirstTouchTarget不為null

1.RecyclerView收到Move事件,由於mFirstTouchTarget不為null,所以會繼續判斷是否由自身攔截事件(onInterceptTouchEvent)

2.如果onInterceptTouchEvent判斷產生了滾動,則返回true表示要進行攔截,會向mFirstTouchTarget分發一個Cancel事件後,將mFirstTouchTarget置為null

3.由於mFirstTouchTarget為null,所以後續的Move事件都會被RecyclerView攔截掉,不會再往下分發,會將事件分發給自身的onTouchEvent

1.如果在Move中,RecyclerView產生滾動攔截了事件,則後續Move、Up都不會傳遞到子View

2.RecyclerView收到Up事件,並且未產生滾動事件,會將事件繼續分發到子View(同Down),

3.子View收到Up事件後,onTouchEvent判斷產生了點擊事件後,回調OnClick

⑧ Android Intent傳遞對象為什麼要序列化,序列化有那幾種方式

        我們都知道進行android 開發的時候,跳轉到Activity和Fragment的時候,傳遞對象是通過Intent或者bundle 進行傳遞。當這個對象沒有實現序列化的時候 當你通過Inetnt傳遞的時候會報紅,系統會提示你將這個對象實現序列化。

      1.先了解一下 什麼是序列化。通過對《Android 開發藝術探索》可以知道序列化是將一個對象轉化成可存儲可傳輸的狀態,序列化後的對象可以在網路上傳輸,也可以存儲到本地。

       2.回到我們的主題,那為什麼要序列化呢?<大致有三個原因>

               a.永久性保存對象,保存對象的位元組序列到本地文件中

               b.對象可以在網路中傳輸

               c.對象可以在IPC之間傳遞

    3.序列化有那幾種方式呢<有兩種方式> 

      android自定義對象可序列化有兩個選擇一個是Serializable和Parcelable

     4.它們之間有什麼區別?

             a.在使用內存的時候Parcelable比Serializable的性能高。

             b.Serializable在序列化的時候會產生大量的臨時變數,從而引起頻繁的GC(內存回收)。

             c.Parcelable不能使用在將對象存儲在磁碟上這種情況,因為在外界的變化下Parcelable不能很好的保證數據的持續性。

            d.實現Serializable很簡單 因為Serializable是一個空介面 所以只要在在實體類中實現這個介面即可 Parcelable就稍微復雜了一點了 

            這里有實現Parcelable 這個介面的列子  blog.csdn.net/jaycee110905/article/details/21517853  

⑨ android里 activity怎麼向service傳遞參數

android中activity中向service傳遞參數,有如下方法:x0dx0ax0dx0a1.在Activity里注冊一個BroadcastReceiver,Service完成某個任務就可以發一個廣播,接收器收到廣播後通知activity做相應的操作。x0dx0a2.使用bindService來關聯Service和Application,應用.apk里的所有組件一般情況都運行在同一個進程中,所以不需要用到IPC,bindService成功後,Service的Client可以得到Service返回的一個iBinder引用,具體的參見Service的文檔及onBind的例子,這樣Service的引用就可以通過返回的iBinder對象得到,如x0dx0apublic class LocalService extends Service {x0dx0a // This is the object that receives interactions from clients. Seex0dx0a // RemoteService for a more complete example.x0dx0a private final IBinder mBinder = new LocalBinder();x0dx0ax0dx0a public class LocalBinder extends Binder {x0dx0a LocalService getService() {x0dx0a return LocalService.this;x0dx0a }x0dx0a }x0dx0ax0dx0a @Overridex0dx0a public IBinder onBind(Intent intent) {x0dx0a return mBinder;x0dx0a }x0dx0a}x0dx0ax0dx0a之後Client通過這個iBinder對象得到Service對象引用之後,可以直接和Service通訊,比如讀取Service中的值或是調用Service的方法。

⑩ 如何在不同的android應用之間傳遞數據

一個Android程序可以由多個Activity和Servier組成,在這些程序組件之間傳遞數據的方法有以下幾種,每種方法都有其特定的使用途徑。 1、原始數據類型: 在Activity/Servier之間傳遞臨時性的原始數據,可以使用Intent的putExtras方法來傳遞數據。若傳遞的數據需要長久保存,則使用SharedPreference類來完成。 2、傳遞對象。 當在Activity/Servier之間傳遞不需要長久保存的對象時,可以使用以下幾種途徑: (1)通過Application類,每個Android應用程序都有一個Application類。當你在程序的AndroidManifest.xml中給Application設定一個名字時,你的程序中就必須有一個Application的子類。這個Application子類會被Android自動實例化,並且是一個全家性的類,它的生命周期和程序的生命周期相同,你可以把一些全局性的對象保存在Application類中。Application類可以通過getApplication()獲得。 (2 通過HashMap of WeakReferences傳遞對象。當一個Activity需要向另外一個Activity傳遞對象時,可以使用一個關鍵字把對象存在一個HashMap中,並把這個關鍵字通過Internt的Extras發給目標Activity,目標Activity接到該關鍵字後使用該關鍵字把對象沖HashMap中取出。

熱點內容
qq和安卓哪個用的人多 發布:2025-07-03 04:31:37 瀏覽:654
日本溥儀訪問 發布:2025-07-03 04:24:27 瀏覽:673
java文件遍歷 發布:2025-07-03 04:22:22 瀏覽:140
android畫虛線 發布:2025-07-03 04:11:04 瀏覽:384
系統啟動密碼怎麼取消 發布:2025-07-03 04:08:06 瀏覽:746
python程序設計第三版課後答案 發布:2025-07-03 03:58:08 瀏覽:213
socket上傳文件 發布:2025-07-03 03:57:24 瀏覽:895
安卓cleo腳本 發布:2025-07-03 03:41:26 瀏覽:245
編程器解讀 發布:2025-07-03 03:22:49 瀏覽:24
中國電信加密通信業務 發布:2025-07-03 03:06:00 瀏覽:521