在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對象獲取,方式如下:
-
MyBinder binder = (MyBinder)service;
-
BindService bindService = binder.getService();
-
通過bindService(此對象就是服務)去調用相應方法即可
也可以通過
mService = IxxxManager.Stub.asInterface(service);得到binder對象的實例進行調用
服務中需要實現onBind方法return我們app需要的IBinder對象
這樣就實現了app調用服務方法,至於服務去調用app相關方法可以通過回調去實現,這裏不做詳細講解
接下來講下aidl通訊過程中可傳輸的數據類型:
- AIDL定義接口的源代碼後綴必須以.aidl結尾。
- AIDL一樣要指定AIDL接口的包信息package *。
- AIDL接口無需指定public、private、protected等作用域,可以理解爲就是public。
- AIDL默認情況下只能傳遞基本類型、String、List、Map、CharSequence。
- 如果需要傳遞其他類型的對象,需要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調用服務的方式,傳輸的類型,以及服務如何能夠保證不被殺死的方式,比較簡潔,讀者有什麼好的建議可以提出,本人將虛心接受,謝謝!