Android中的服務(service)詳解(一)
阿新 • • 發佈:2019-02-03
1. 引言:
在Android系統中,到處可見service(服務)這個單詞,從功能上來講,它意味著沒有UI介面,作為一個後臺程序,執行一些特定的任務。在Android應用開發過程中,也免不了需要開發一些service來完成一些功能,而這種應用層的service(繼承看自service)只是整個Android service這一概念的一部分而已,本系列文章將從Android系統平臺的角度,詳細剖析Android中的“服務”這一概念,以便使大家全面瞭解service。
2. 從例子出發:
下面,舉幾個例子,來看一下,Android平臺中,service這個概念如何為我們服務:
1). 繼承自service的類,來實現自定義的service:
2). 通過呼叫getSystemService來獲取服務,例如:
(1). 獲取TelephonyManager服務:
TelephonyManager tm = (TelephonyManager) context
ActivityManager mActivityManager = (ActivityManager) context
.getSystemService(Context.ACTIVITY_SERVICE);
(3). 獲取WifiManager服務:
WifiManager wifi = (WifiManager) context
3). 多媒體服務和相機服務的獲取:
(1). 獲取TelephonyManager服務:
MediaPlayer mp = new MediaPlayer();
try {
mp.setDataSource("/sdcard/test.mp3");
mp.prepare();
mp.start();
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
(1). 獲取Camera服務:
Camera myCamera;
myCamera = Camera.open();
4). 從程序的角度來看:
我們用ps命令可以得到大概如下的結果:
system 1925 1 1088 404 c046d4c0 400a3b94 S /system/bin/servicemanager
system 1937 1 122192 6784 ffffffff 40152b94 S /system/bin/surfaceflinger
root 1938 1 462604 49036 ffffffff 40096cb8 S zygote
media 1940 1 170092 18144 ffffffff 40069b94 S /system/bin/mediaserver
system 2306 1938 650636 87712 ffffffff 40096b94 S system_server
init: 是Linux啟動的第一個使用者程序,它的ppid是0,而這個0程序所在的程序就是linux kerner。
servicemanager:是由init啟動的,用於管理其它的service,是用c++實現的。
zygote:android的核心所在,所有的app都是它的子程序,可以認為runtime和jvm都在這個程序裡。
mediaserver:多媒體服務程序,是由C++實現的。
system_server:可以認為它就是Android framework所在的程序,而這個程序裡面包括了很多的systemservice,也就是用getSystemService得到的那些。
com.qihoo360.mobilesafe:GuardService:很明顯,是360手機助手的一個service。
5)從AndroidMenifest.xml中的service 定義來看,下面是一個例子:
<service
android:name="com.test.service.MyService" >
</service>
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote" >
</service>
MyService是一個本地應用服務,和應用程式是屬於同一個程序;
com.baidu.location.f是百度地圖的服務,和應用程式不屬於同一個程序;
3. Android服務分類:
從以上例子可以看出,service這一概念的使用方式有好幾種,可以這樣理解,從狹義上講,service就是Android應用程式的四大元件之一;從廣義上講,service還包含系統中提供的其它系統級的service。
所以,從概念上,可以將service分為以下2類:
1) . 應用程式服務:基於Android SDK的應用程式服務,需要通過繼承service來實現,如com.qihoo360.mobilesafe:GuardService。它又可以分為本地服務(注意和本地系統服務的區別)和遠端服務。
(1) 本地服務:
和activity處於同一程序,當activity所在的應用程式終止,這個服務也終止了;
繼承自service,通過bindService 或者startService來繫結;
在AndroidMenifest.xml中,不用android:process=":remote"
(2) 遠端服務:
與activity的程序不是同一個程序,activity所在的應用終止,並不會終止遠端服務。
需要通過Android的binder IPC機制來繫結。
(1)java系統服務:
可以認為是基於Framework層(屬於system_server)的,可以用getSystemService來獲取,如WifiManager,TelephonyManager,ActivityManager。
(2)本地系統服務:
更加底層的服務(用c/c++編寫,通常是一個獨立的程序,而且它的父程序是init),如,surfaceflinger,mediaserver。
下篇,將分別說明各種service的實現方式。
在Android系統中,到處可見service(服務)這個單詞,從功能上來講,它意味著沒有UI介面,作為一個後臺程序,執行一些特定的任務。在Android應用開發過程中,也免不了需要開發一些service來完成一些功能,而這種應用層的service(繼承看自service)只是整個Android service這一概念的一部分而已,本系列文章將從Android系統平臺的角度,詳細剖析Android中的“服務”這一概念,以便使大家全面瞭解service。
2. 從例子出發:
下面,舉幾個例子,來看一下,Android平臺中,service這個概念如何為我們服務:
1). 繼承自service的類,來實現自定義的service:
public Myservice extends Service {實現相關方法...};
(1). 獲取TelephonyManager服務:
TelephonyManager tm = (TelephonyManager) context
.getSystemService(Context.TELEPHONY_SERVICE);
(2). 獲取ActivityManager服務:ActivityManager mActivityManager = (ActivityManager) context
.getSystemService(Context.ACTIVITY_SERVICE);
(3). 獲取WifiManager服務:
WifiManager wifi = (WifiManager) context
.getSystemService(Context.WIFI_SERVICE);
(1). 獲取TelephonyManager服務:
MediaPlayer mp = new MediaPlayer();
try {
mp.setDataSource("/sdcard/test.mp3");
mp.prepare();
mp.start();
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
(1). 獲取Camera服務:
Camera myCamera;
myCamera = Camera.open();
...
我們用ps命令可以得到大概如下的結果:
USER PID PPID VSIZE RSS WCHAN PC NAME
root 1 0 488 348 c015ccc8 0000f2d0 S /initsystem 1925 1 1088 404 c046d4c0 400a3b94 S /system/bin/servicemanager
system 1937 1 122192 6784 ffffffff 40152b94 S /system/bin/surfaceflinger
root 1938 1 462604 49036 ffffffff 40096cb8 S zygote
media 1940 1 170092 18144 ffffffff 40069b94 S /system/bin/mediaserver
system 2306 1938 650636 87712 ffffffff 40096b94 S system_server
u0_a162 3055 1938 522472 70192 ffffffff 40097a70 S com.qihoo360.mobilesafe:GuardService
是不是有很多"service"這個單詞呢?簡要說明一下這幾個重要的程序:init: 是Linux啟動的第一個使用者程序,它的ppid是0,而這個0程序所在的程序就是linux kerner。
servicemanager:是由init啟動的,用於管理其它的service,是用c++實現的。
zygote:android的核心所在,所有的app都是它的子程序,可以認為runtime和jvm都在這個程序裡。
mediaserver:多媒體服務程序,是由C++實現的。
system_server:可以認為它就是Android framework所在的程序,而這個程序裡面包括了很多的systemservice,也就是用getSystemService得到的那些。
com.qihoo360.mobilesafe:GuardService:很明顯,是360手機助手的一個service。
5)從AndroidMenifest.xml中的service 定義來看,下面是一個例子:
<service
android:name="com.test.service.MyService" >
</service>
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote" >
</service>
MyService是一個本地應用服務,和應用程式是屬於同一個程序;
com.baidu.location.f是百度地圖的服務,和應用程式不屬於同一個程序;
3. Android服務分類:
從以上例子可以看出,service這一概念的使用方式有好幾種,可以這樣理解,從狹義上講,service就是Android應用程式的四大元件之一;從廣義上講,service還包含系統中提供的其它系統級的service。
所以,從概念上,可以將service分為以下2類:
1) . 應用程式服務:基於Android SDK的應用程式服務,需要通過繼承service來實現,如com.qihoo360.mobilesafe:GuardService。它又可以分為本地服務(注意和本地系統服務的區別)和遠端服務。
(1) 本地服務:
和activity處於同一程序,當activity所在的應用程式終止,這個服務也終止了;
繼承自service,通過bindService 或者startService來繫結;
在AndroidMenifest.xml中,不用android:process=":remote"
(2) 遠端服務:
與activity的程序不是同一個程序,activity所在的應用終止,並不會終止遠端服務。
需要通過Android的binder IPC機制來繫結。
在AndroidMenifest.xml中,必須用android:process=":remote"
2) 系統服務:處於framework以及framework層以下的服務。系統服務又可以分為java系統服務和本地系統服務,如MyService是一個本地服務,而com.baidu.location.f是一個遠端服務。(1)java系統服務:
可以認為是基於Framework層(屬於system_server)的,可以用getSystemService來獲取,如WifiManager,TelephonyManager,ActivityManager。
(2)本地系統服務:
更加底層的服務(用c/c++編寫,通常是一個獨立的程序,而且它的父程序是init),如,surfaceflinger,mediaserver。
下篇,將分別說明各種service的實現方式。