天天看點

閱讀手劄:《Android開發藝術探索》(二)

《閱讀手劄:《Android開發藝術探索》(一)》

中主要介紹了Activity的生命周期以及異常處理、啟動模式、意圖過濾器。本篇文章主要介紹的是《Android開發藝術探索》的第二章 IPC機制

個人評語:第二章的内容非常多(第二章近90頁内容),内容有IPC機制基本概念;序列化Serializable、Parcelable;Binder;實作IPC的多種方式;Binder連接配接池内容非常多,但還是要耐着性子分析完。

IPC基本概念:

IPC、是英文 Inter-Process-Communication的縮寫,翻譯過來就是跨程序通信或者程序間通信、程序簡單了解就是一個應用或者一個程式、而線程是程序的最小執行單元,關于線程、

必須要理清的Java線程池(原創)

這裡有近萬字的較長的描述。那什麼情況會考慮跨程序的通信,畢竟任何概念的設計出現都是為了解決問題以及應用實踐而誕生的。

一般來說,跨程序通信的實作理由分為兩種:

  • A:某些原因下自身需要多程序來實作,如:特殊原因需要運作在獨立的線程;或者為了加大一個應用的記憶體來擷取更大的記憶體空間提高運作流暢度(參考某Q的做法)
  • B:目前應用為了擷取其他應用的資料

以上兩種情況是跨程序通信的實作場景。

那如何開啟跨程序通信?

在Android中開啟多程序的方式隻有一種:給四大元件在清單檔案注冊的時候,在對應的元件标簽内部聲明如下即可:

android:process = " "
           

注意,這種跨程序通信的标簽有2種寫法,寫法的不同代表的意思也不同,假定現在的包名是:com.test.tzw

  • 寫法一:
android:process = ":newpro"
           

這種寫法,标簽代表的具體意思是(:這個符号)目前元件,運作的程序名稱是,目前包名加程序名,也就是com.test.tzw:newpro,當然這也代表它是一個私有程序,不以:開頭的程序屬于全局程序,其他應用可以通過ShareUID方式跟他跑在同一個程序

  • 寫法二:
android:process = "com.test.loveandroid.newpro"
           

寫法二,這是一種完整的命名方式,不會附加包名資訊。

跨程序通信帶來的問題:

跨程序通信也會帶來一系列問題,在這種模式下帶來的後果之前我們先搞清楚幾個基本概念:

概念一:

Java基礎告訴我們,靜态成員變量在所有地方共享,一處修改所有對應的靜态成員變量都會生效,但是Android系統為每一個應用都提供了一個獨立的虛拟機,不同的虛拟機會有不同的位址空間,這就導緻不同的虛拟機

通路同一個類的對象會有多個副本

概念二:

線程是基于程序存在的,程序有變化,線程對應也會存在相應的變化

概念三:

SharedPreferences是我們很熟悉的存儲資料的方式,它的底層是用XML進行檔案的讀/寫,如果跨程序同時操作可能會造成穩定性下降

概念四:

跨程序,理論上在系統上又開辟配置設定了一個新的虛拟機,同樣Application也會根據開辟配置設定的次數建立對應的次數

總結,跨程序帶來的問題如下:

  • 靜态成員變量和單例模式失效
  • 線程同步機制完全失效
  • SharedPreferences穩定性下降
  • Application會多次建立

序列化:

大家對序列化都已經很熟悉了,這裡就快速總結,序列化一共分2種,一種是Java自帶的序列化,也就是Serializable,還有一種是Android提供的序列化,也就是Parcelable。實作序列化主要是為了通過Intent、Binder傳輸對象資料使用,當然,

阿裡的路由架構

也要求對象傳遞使用序列化,下面就逐個分析:

Serializable

這是Java為我們提供的,使用起來很簡單,JavaBean對象直接實作Serializable接口,在聲明一個 serialVersionUID即可,

當然,這個serialVersionUID不寫也可以,但是會對反序列化過程産生影響,是以正确的使用姿勢還是是按照說明,聲明serialVersionUID,這個serialVersionUID一般為這個類的hash值。

注意:

  • 靜态成員變量屬于類而不屬于對象,是以不會參與序列化過程
  • 使用transient關鍵字聲明的成員變量不會被序列化

Parcelable

Parcelable序列化是Android給我們提供的一種序列化方式,它的寫法稍微複雜,但是不用怕,現在已經有插件幫我們一鍵生成Parcelable序列化,而且Parcelable序列化效率比Serializable更高、且更友善我們在Android平台上面使用。

那麼實作IPC的方式有:

閱讀手劄:《Android開發藝術探索》(二)

IPC實作方式

如果這篇文章對你有幫助,希望各位看官留下寶貴的star,謝謝。

Ps:著作權歸作者所有,轉載請注明作者, 商業轉載請聯系作者獲得授權,非商業轉載請注明出處(開頭或結尾請添加轉載出處,添加原文url位址),文章請勿濫用,也希望大家尊重筆者的勞動成果。

繼續閱讀