1. 程式人生 > >APP中一種在Java層實現的簡單守護程序方式

APP中一種在Java層實現的簡單守護程序方式

守護程序是一個黑色地帶的產物,無論是通過native的方式在linux中fork程序達到,還是在java層通過兩個service守護的方式,都是不太友好的做法,據很多人反應,總有一些實際的業務場景中,希望自己的應用保持live狀態,
一種是在native中做:

  • linux中多程序;
  • unix domain套接字實現跨程序通訊;
  • linux的訊號處理;
  • exec函式族的用法;

把他們組合起來實現了一個雙程序守護,幾個實現雙程序守護時的關鍵點:

1.父程序如何監視到子程序(監視程序)的死亡?

  • 很簡單,在linux中,子程序被終止時,會向父程序傳送SIG_CHLD訊號,於是我們可以安裝訊號處理函式,並在此訊號處理函式中重新啟動建立監視程序;

2.子程序(監視程序)如何監視到父程序死亡?

  • 當父程序死亡以後,子程序就成為了孤兒程序由Init程序領養,於是我們可以在一個迴圈中讀取子程序的父程序PID,當變為1就說明其父程序已經死亡,於是可以重啟父程序。這裡因為採用了迴圈,所以就引出了之前提到的耗電量的問題。

3.父子程序間的通訊

  • 有一種辦法是父子程序間建立通訊通道,然後通過監視此通道來感知對方的存在,這樣不會存在之前提到的耗電量的問題,在本文的實現中,為了簡單,還是採用了輪詢父程序PID的辦法,但是還是留出了父子程序的通訊通道,雖然暫時沒有用到,但可備不時之需!

今天介紹下用兩個service守護的方式作一完整的小案例。僅作學習交流之用。兩個程序互相監視對方,發現對方掛掉就立刻重啟!(實際就是在onDisconnected時,start另一個service)

假設我們的APP中開啟了兩個Service,分別是A和B,那麼:
如果A守護B,則B掛掉的同時,A就應該把B喚醒起來,反之亦然,也就是說A和B應該是互相守護,無論誰被殺掉,對方就把它喚醒起來。
既然提到了兩個Service,那麼這兩個Service就不能讓它們同處在一個程序中,否則就會被一次性雙殺。顯然不能在同一個程序中,在Android中通常我們可以使用AIDL來實現IPC實現。

原理圖(簡單版):


這裡寫圖片描述

ServiceA.Java

這裡寫圖片描述
這裡寫圖片描述

ServiceB.Java

這裡寫圖片描述
這裡寫圖片描述

MainActivity.java

這裡寫圖片描述

Manifest.xml

這裡寫圖片描述


IBridgeInterface.aidl

這裡寫圖片描述

效果圖:

這裡寫圖片描述

第一時間獲得部落格更新提醒,以及更多android乾貨,原始碼分析,歡迎關注我的微信公眾號,掃一掃下方二維碼或者長按識別二維碼,即可關注。

這裡寫圖片描述

如果你覺得好,隨手點贊,也是對筆者的肯定,也可以分享此公眾號給你更多的人,原創不易