Android中的服务(service)详解(一)
16lz
2021-01-24
1. 引言:
在Android系统中,到处可见service(服务)这个单词,从功能上来讲,它意味着没有UI界面,作为一个后台进程,执行一些特定的任务。在Android应用开发过程中,也免不了需要开发一些service来完成一些功能,而这种应用层的service(继承看自service)只是整个Android service这一概念的一部分而已,本系列文章将从Android系统平台的角度,详细剖析Android中的“服务”这一概念,以便使大家全面了解service。
2. 从例子出发:
下面,举几个例子,来看一下,Android平台中,service这个概念如何为我们服务:
1). 继承自service的类,来实现自定义的service:
(1). 获取TelephonyManager服务:
TelephonyManager tm = (TelephonyManager) context
ActivityManager mActivityManager = (ActivityManager) context
.getSystemService(Context.ACTIVITY_SERVICE);
(3). 获取WifiManager服务:
WifiManager wifi = (WifiManager) context
(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命令可以得到大概如下的结果:
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
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"
(1)java系统服务:
可以认为是基于Framework层(属于system_server)的,可以用getSystemService来获取,如WifiManager,TelephonyManager,ActivityManager。
(2)本地系统服务:
更加底层的服务(用c/c++编写,通常是一个独立的进程,而且它的父进程是init),如,surfaceflinger,mediaserver。
下篇,将分别说明各种service的实现方式。
更多相关文章
- Android(安卓)Binder 机制学习总结(一)
- Android权限获取机制与常见权限不足问题分析
- Android(安卓)7.0新特性概览
- android4.0 进程回收机制
- android艺术开发探索之RemoteViews跨进程更新UI
- 第二章 IPC机制—学习笔记
- android 6.0运行时权限的申请(微信在android 6.0上实现运行时请求
- Android系统下的动态Dex加载
- 【Android】18.1 利用安卓内置的定位服务实现位置跟踪