1. 引言:
在Android系统中,到处可见service(服务)这个单词,从功能上来讲,它意味着没有UI界面,作为一个后台进程,执行一些特定的任务。在Android应用开发过程中,也免不了需要开发一些service来完成一些功能,而这种应用层的service(继承看自service)只是整个Android service这一概念的一部分而已,本系列文章将从Android系统平台的角度,详细剖析Android中的“服务”这一概念,以便使大家全面了解service。


2. 从例子出发:
下面,举几个例子,来看一下,Android平台中,service这个概念如何为我们服务:
1). 继承自service的类,来实现自定义的service:

public Myservice extends Service {实现相关方法...};


2). 通过调用getSystemService来获取服务,例如:
(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);


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命令可以得到大概如下的结果:

USER PID PPID VSIZE RSS WCHAN PC NAME

root 1 0 488 348 c015ccc8 0000f2d0 S /init
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

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的实现方式。




更多相关文章

  1. Android(安卓)Binder 机制学习总结(一)
  2. Android权限获取机制与常见权限不足问题分析
  3. Android(安卓)7.0新特性概览
  4. android4.0 进程回收机制
  5. android艺术开发探索之RemoteViews跨进程更新UI
  6. 第二章 IPC机制—学习笔记
  7. android 6.0运行时权限的申请(微信在android 6.0上实现运行时请求
  8. Android系统下的动态Dex加载
  9. 【Android】18.1 利用安卓内置的定位服务实现位置跟踪

随机推荐

  1. android xml操作
  2. android列表为空时提示语
  3. Android逐帧动画的实现
  4. android 权限库,拿来就能用
  5. android检查sqlite数据库中是否存在某个
  6. android gmail send email
  7. Android关于图片处理,更改图片灰度
  8. 【转】android常用组件
  9. Android检测电源状态
  10. 如何为Android Activity设置背景图片?