Android進程通訊之Service與app的通訊

      在Android開發的過程中,進程之間的通訊是很常見的,例如獲取其他應用的數據庫數據,獲取導航相關信息,系統服務調用,獲取後臺數據,文件數據傳輸等等。在這些進程通訊裏面,service與app之間通訊用的比較平凡,現在很多的第三方服務商,像百度,高德,科大等等都是通過sdk的方式(其實就是service和app之間的通訊)提供給客戶使用,客戶通過調用sdk裏面相關api去綁定相應服務商的服務,然後進行通信。下面就簡單講解下service與app是如何進行通信以及通訊傳輸的數據類型:

app中調用service方式:(通過Intent傳遞),具體是

1:通過startService調用:

Intent intent=new Intent("xxx");   //xxx表示隱式調用服務的Action

或者Intent intent=new Intent(this,xxx);   //xxx表示顯式調用服務的類

startService(intent);

2:通過bindService調用:

Intent intent = new Intent(this, xxx); //xxx表示顯式調用服務的類

bindService(intent, conn, Service.BIND_AUTO_CREATE);

其中conn表示綁定服務監聽
    private class Conn implements ServiceConnection{
        //綁定服務成功的監聽  service:是服務綁定成功後的返回值:onbind方法的返回值
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
        }
        //因爲異常,綁定服務失敗的監聽
        @Override
        public void onServiceDisconnected(ComponentName name) {
            // TODO Auto-generated method stub
        }
    }

下面是兩種服務的生命週期:

注意:調用startService結束是使用stopService,而調用bindService結束是調用unbindService,如果先bindService再startService然後需要結束服務的話需要先unbindservice再stopservice

bindService獲取服務對象的方式:

在onServiceConnected方法中通過IBinder對象獲取,方式如下:

  1. MyBinder binder = (MyBinder)service;

  2. BindService bindService = binder.getService();

  3. 通過bindService(此對象就是服務)去調用相應方法即可

也可以通過

mService = IxxxManager.Stub.asInterface(service);得到binder對象的實例進行調用

服務中需要實現onBind方法return我們app需要的IBinder對象

這樣就實現了app調用服務方法,至於服務去調用app相關方法可以通過回調去實現,這裏不做詳細講解

接下來講下aidl通訊過程中可傳輸的數據類型:

  1. AIDL定義接口的源代碼後綴必須以.aidl結尾。
  2. AIDL一樣要指定AIDL接口的包信息package *。
  3. AIDL接口無需指定public、private、protected等作用域,可以理解爲就是public。
  4. AIDL默認情況下只能傳遞基本類型、String、List、Map、CharSequence。
  5. 如果需要傳遞其他類型的對象,需要import對象的包名,並需要對對象進行特殊處理(後續介紹)。

關於如何不讓service被殺死問題處理:

1. onStartCommand方式中,返回START_STICKY

2.提高Service的優先級
在AndroidManifest.xml文件中對於intent-filter可以通過android:priority = "1000"這個屬性設置最高優先級,1000是最高值,如果數字越小則優先級越低,同時適用於廣播。

3.提升Service進程的優先級

當系統進程空間緊張時,會依照優先級自動進行進程的回收。
Android將進程分爲6個等級,按照優先級由高到低依次爲:

  • 前臺進程foreground_app
  • 可視進程visible_app
  • 次要服務進程secondary_server
  • 後臺進程hiddena_app
  • 內容供應節點content_provider
  • 空進程empty_app
    可以使用startForeground將service放到前臺狀態,這樣低內存時,被殺死的概率會低一些。

4.在onDestroy方法裏重啓Service
當service走到onDestroy()時,發送一個自定義廣播,當收到廣播時,重新啓動service。

5.系統廣播監聽Service狀態
6.將APK安裝到/system/app,變身爲系統級應用

本文章大致講了下app調用服務的方式,傳輸的類型,以及服務如何能夠保證不被殺死的方式,比較簡潔,讀者有什麼好的建議可以提出,本人將虛心接受,謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章