(六)Android的IPC機(jī)制的基礎(chǔ)

本文為Android的IPC相關(guān)知識(shí)整理,具體參考了

  • 《Android開發(fā)藝術(shù)探索》第二章 IPC機(jī)制

IPC拣凹,Inter-Process Communicatoin的縮寫。即為Android進(jìn)程間通信。


1,進(jìn)程與線程

  • 線程是CPU調(diào)度的基本單位忘衍,進(jìn)程一般指一個(gè)執(zhí)行單元,在移動(dòng)設(shè)備上指一個(gè)應(yīng)用或者是一個(gè)程序卿城。一個(gè)進(jìn)程包含一個(gè)或多個(gè)線程枚钓。
  • 在Android中,一個(gè)程序可以只有一個(gè)線程瑟押,即主線程搀捷,也叫UI線程。在UI線程中才能操作界面元素勉耀,而不能在UI線程中執(zhí)行大量耗時(shí)任務(wù),否則會(huì)造成ANR蹋偏,Application not responding錯(cuò)誤便斥。

Android線程(Thread)間通信:

  • Handle和Looper配合,消息隊(duì)列機(jī)制威始。我們可以用AsyncTask類這個(gè)異步任務(wù)類枢纠。
  • 訪問其他應(yīng)用程序的Activity,通過Intent附帶信息
    IntentcallIntent= newIntent(Intent.ACTION_CALL,Uri.parse("tel:12345678");
    startActivity(callIntent);
  • ContentProvider黎棠,例如訪問系統(tǒng)相冊(cè)晋渺,通訊錄镰绎,短信等
  • Broadcast 廣播
  • AIDL,Android接口定義語言

Android進(jìn)程(Process)間通信:

  • Binder
  • Socket
  • 文件共享
  • ContentProvider
  • Intent
  • Messenger

2木西,Android中的多進(jìn)程

在Android中使用多進(jìn)程只有一種方法畴栖,即給四大組件在AndroidManifest中指定android:process屬性。

   <activity
         android:name="com.ryg.chapter_2.MainActivity"
         android:label="@string/app_name">
         <intent-filter>
             ....
         </intent-filter>
    </acitivty>
    <activity
         android:name="com.ryg.chapter_2.SecondAcitvity"
         android:process=":remote"/>
    <activity
         android:name="com.ryg.chapter_2.ThirdAcitvity"
         android:process="com.ryg.chapter.remote"/>

以上三個(gè)activity分別在以下進(jìn)程中:

  • com.ryg.chapter_2八千,沒有為組件指定process吗讶,那么這個(gè)組件就會(huì)運(yùn)行在默認(rèn)進(jìn)程中。
  • com.ryg.chapter_2:remote恋捆,冒號(hào)的含義是在當(dāng)前的進(jìn)程名上附加當(dāng)前的包名照皆,此進(jìn)程屬于當(dāng)前應(yīng)用的私有進(jìn)程。
  • com.ryg.chapter_2.remote沸停,進(jìn)程名不以冒號(hào)開頭的進(jìn)程屬于全局進(jìn)程膜毁,其他應(yīng)用通過ShareUID方式可以和它跑在同一個(gè)進(jìn)程中。

由于Android會(huì)為每一個(gè)進(jìn)程提供單獨(dú)的虛擬機(jī)愤钾,不同的虛擬機(jī)在內(nèi)存分配上有不同的地址空間瘟滨,因而在不同的虛擬機(jī)中訪問同一個(gè)類對(duì)象會(huì)產(chǎn)生多份副本。不同進(jìn)程的虛擬機(jī)绰垂,Application室奏,內(nèi)存空間都不一樣!>⒆啊k誓!相當(dāng)于兩個(gè)不同的應(yīng)用采用了SharedUID模式占业。

多進(jìn)程引起的問題:

  • 靜態(tài)成員和單例模式失效
  • 線程同步機(jī)制失效
  • SharedPreferences可靠性下降绒怨,其不支持兩個(gè)進(jìn)程同時(shí)執(zhí)行寫操作。
  • Application會(huì)多次重建

3谦疾,IPC基礎(chǔ)概念

當(dāng)我們需要通過Intent和Binder傳輸數(shù)據(jù)時(shí)南蹂,需要使用Serializable和Serializable接口來完成對(duì)象的序列化
當(dāng)我們需要使對(duì)象持久化到存儲(chǔ)設(shè)備上時(shí)念恍,需要使用Serializable來完成對(duì)象的持久化六剥。

3.1 Serializable接口

這個(gè)是Java自帶的,很簡(jiǎn)單但是內(nèi)存開銷大峰伙,只需要在類中加入serialVersionUID疗疟。適用于將對(duì)象序列化到存儲(chǔ)設(shè)備或者將對(duì)象序列化后通過網(wǎng)絡(luò)進(jìn)行傳輸。

    public class User implements Serializable{
          private static final serialVersionUID = 4132904873290147032L;

          public int userId;
          public String userName;
          public boolean isMale;
    }

序列化和反序列化過程

     //序列化
    User user = new User(0, "jake",true;);
    ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("cache.txt"));
    out.writeObject(user);
    out.close();

     //反序列化
    ObjectInputStream in= new ObjectInputStream(new FileInputStream("cache.txt"));
    User newUser = (User)in.readObject();
    in.close();

恢復(fù)后的newUser對(duì)象和user內(nèi)容完全一致瞳氓,但不是同一對(duì)象策彤。

為了避免反序列化失敗,serialVersionUID 一般應(yīng)該手動(dòng)指定!5晔裹刮!其實(shí)也可以不指定serialVersionUID ,但這樣的話是IDE自動(dòng)根據(jù)類結(jié)構(gòu)去生成hash值庞瘸,這樣的話我們對(duì)其的控制力就弱了捧弃,如果改變了類結(jié)構(gòu),就不能反序列化了K≈蕖K稹!霜第!而手動(dòng)指定serialVersionUID 可以最大限度恢復(fù)數(shù)據(jù)葛家。

3.2 Parcelable接口

這個(gè)是Android獨(dú)有的,更適合用在Android平臺(tái)泌类,效率高癞谒,但是用起來有點(diǎn)麻煩。

    public class User implements parcelable{
          public int userId;
          public String userName;
          public boolean isMale;
          
          public User(int userId, String userName, boolean isMale){
              this.userId = userId;
              this.userName = userName;
              this.isMale = isMale;
          }

          public Book book;
          
          //內(nèi)容描述
          public int describeContents(){
                return 0;
          }

          //序列化
          public void writeToParcel(Parcel out, int flags){
                out.writeInt(userId);
                out.writeString(userName);
                out.writeInt(isMale ? 1 : 0);
                out.writeParcelable(book, 0 );
          }

          //反序列化
          public static final Parcelable.Creator<user> CREATOR = new Parcelable.Creator<User>(){
                 //從序列化后的對(duì)象中創(chuàng)建原始對(duì)象
                 public User createFromParcel(Parcel in){
                      return new User(in); 
                }
               
                 //創(chuàng)建指定長(zhǎng)度的原始對(duì)象
                public User[] newArray(int size){
                       return new User[size];
                }
          };


          private User(Parcel in){
                userId = in.readInt();
                userName = in.readString();
                isMale = in.readInt() = 1;
                book = in.readParcelable(Thread.currentThread().getContextClassLoader());
          }
          
          
    }

3.3 Binder

  • 從IPC角度看刃榨,Binder是一種跨進(jìn)程通信方式弹砚。
  • 從Android Freamwork角度來說,Binder是ServiceManager連接各種Manager(ActivityManager枢希、WindowManager)和相應(yīng)ManagerService的橋梁桌吃。
  • 從Android應(yīng)用層將,Binder是客戶端和服務(wù)器進(jìn)行通信的媒介苞轿。

Android開發(fā)中茅诱,Binder主要用在Service中,包括AIDL搬卒,Messenger瑟俭。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市契邀,隨后出現(xiàn)的幾起案子摆寄,更是在濱河造成了極大的恐慌,老刑警劉巖坯门,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件微饥,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡古戴,警方通過查閱死者的電腦和手機(jī)欠橘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來允瞧,“玉大人简软,你說我怎么就攤上這事∈鲈荩” “怎么了痹升?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)畦韭。 經(jīng)常有香客問我疼蛾,道長(zhǎng),這世上最難降的妖魔是什么艺配? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任察郁,我火速辦了婚禮,結(jié)果婚禮上转唉,老公的妹妹穿的比我還像新娘皮钠。我一直安慰自己,他們只是感情好赠法,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布麦轰。 她就那樣靜靜地躺著,像睡著了一般砖织。 火紅的嫁衣襯著肌膚如雪款侵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天侧纯,我揣著相機(jī)與錄音新锈,去河邊找鬼。 笑死眶熬,一個(gè)胖子當(dāng)著我的面吹牛妹笆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播聋涨,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼晾浴,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了牍白?” 一聲冷哼從身側(cè)響起脊凰,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎茂腥,沒想到半個(gè)月后狸涌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡最岗,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年帕胆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片般渡。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡懒豹,死狀恐怖芙盘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情脸秽,我是刑警寧澤儒老,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站记餐,受9級(jí)特大地震影響驮樊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜片酝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一囚衔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧雕沿,春花似錦练湿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至断国,卻和暖如春贤姆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背稳衬。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工霞捡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人薄疚。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓碧信,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親街夭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子砰碴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

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