一:Service是什么

Service,服务。一般用于提供需要在后台长期运行的服务(如复杂计算、下载等等耗时任务),其特点是长生命周期的、没有用户界面、在后台运行的。

二:Service的生命周期方法

在定义Service子类时,需要重写以下方法:

内部自动调用的方法 作用
onCreat() 创建服务
onStartCommand() 开始服务
onDestroy() 销毁服务
onBind() 绑定服务
onUnbind() 解绑服务

在其他地方,创建服务、启动服务、停止服务时,需要调用以下方法:

startService() 启动服务
stopService() 关闭服务
bindService() 绑定服务
unbindService() 解绑服务

1:调用startService()后,自动调用service内部方法:onCreate()、onStartCommand()

2:调用stopService()后,自动调用内部方法:onDestory()

3:调用bindService()后,自动调用内部方法:onCreate()、onBind()

4:调用unbindService()后,自动调用内部方法:onCreate()、onBind()、onDestory()

三:常见的生命周期调用

1:startService()启动服务、stopService()停止服务:只能开启和关闭Service,无法操作Service;若启动服务后,无手动调用stopService(),则程序退出后服务仍然存在

2:bindService()绑定服务、unbindService()解绑服务:Service随着调用者销毁而停止。

3:使用startService()启动服务,再使用bindService()绑定服务——使用unbindService()解绑服务,再使用stopService()停止服务:要先解绑,才能停止服务。

四:Service的类型

【图片来自:http://www.jianshu.com/p/d963c55c3ab9

五:不同类型Service的使用

1:本地服务:与某一个程序相关,在程序的代码中启动、停止服务

步骤1:新建子类继承Service类,重写父类的onCreate()、onStartCommand()、onDestroy()和onBind()方法
步骤2:在AndroidManifest.xml里注册该Service
步骤3:在activity的代码中,创建用于启动Service的Intent对象
步骤4:调用startService(intent)启动Service、调用stopService(intent)停止服务

    Androidmanifest里Service的常见属性说明

属性 说明 备注
android:name Service的类名  
android:label Service的名字 若不设置,默认为Service类名
android:icon Service的图标  
android:permission 申明此Service的权限 有提供了该权限的应用才能控制或连接此服务
android:process 表示该服务是否在另一个进程中运行(远程服务) 不设置默认为本地服务;remote则设置成远程服务
android:enabled 系统默认启动 true:Service 将会默认被系统启动;不设置则默认为false
android:exported 该服务是否能够被其他应用程序所控制或连接 不设置默认此项为 false

2:远程服务:与程序无关,系统级别的服务

远程Service与调用者不在同一个进程里(即远程Service是运行在另外一个进程)

一般用在多个应用程序共享同一个后台服务(远程服务)的情况。

我们把Service称为服务器端、需要与Service通信的进程称为客户端。

  • 以下是两个进程角色的具体使用步骤:
    服务器端(Service)
    步骤1:新建定义AIDL文件,并声明该服务需要向客户端提供的接口
    步骤2:在Service子类中实现AIDL中定义的接口方法,并定义生命周期的方法(onCreat、onBind()、blabla)
    步骤3:在AndroidMainfest.xml中注册服务 & 声明为远程服务

    客户端(Client)
    步骤1:拷贝服务端的AIDL文件到目录下
    步骤2:使用Stub.asInterface接口获取服务器的Binder,根据需要调用服务提供的接口方法
    步骤3:通过Intent指定服务端的服务名称和所在包,绑定远程Service

AIDL:Android Interface Definition Language,即Android接口定义语言;用于让某个Service与多个应用程序组件之间进行跨进程通信,从而可以实现多个应用程序共享同一个Service的功能。

具体使用参见:http://www.jianshu.com/p/34326751b2c6

3:前台服务

前台服务是指在手机的下拉通知栏保持显示一个通知。

前台Service优先级较高,不会由于系统内存不足而被回收;后台Service优先级较低,当系统出现内存不足情况时,很有可能会被回收。

前台服务不是一种特殊的服务类型,它只是在一般的后台服务的基础上添加了几个属性,使其具有了前台显示的界面而已。任何服务都可以通过以下方法成为前台服务:

在原有的Service类对onCreate()方法中添加以下内容:

@Override
public void onCreate() {
super.onCreate(); //添加下列代码将后台Service变成前台Service
//1:创建"点击通知"后要跳转至哪个页面的Intent对象
Intent notificationIntent = new Intent(this,MainActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this,0,notificationIntent,0); //2:新建通知栏的Builer对象
Notification.Builder builer = new Notification.Builder(this);
//3:用通知栏的builder对象进行通知图标、标题、内容、点击事件的设置
builer.setContentTitle("前台服务通知的标题");//设置通知的标题
builer.setContentText("前台服务通知的内容");//设置通知的内容
builer.setSmallIcon(R.mipmap.ic_launcher);//设置通知的图标
builer.setContentIntent(pendingIntent);//设置点击通知后的操作
//4:使用builder创建出一个通知
Notification notification = builer.getNotification();//用Builder对象生成notification
//5:让通知在下拉通知栏显示
startForeground(1, notification);
}

4:可通信服务

上面创建的服务,除了启动、停止之外,并不能与activity进行交互,即:activity不能访问服务中的其他方法。

要通过activity操作service的话,需要用到绑定服务。

1)新建子类继承Service类,并在其中新建一个内部类继承自Binder类,在binder子类中定义Activity需要调用的方法。

然后在Service子类中创建binder子类实例,并在onBind()方法中return 这个实例。

2)在Activity中,创建ServiceConnection实例,并且重写其onServiceConnected()方法,把连接传递过来的binder强制类型转换为第一步中创建的binder。

3)在Activity中,创建一个binder实例,然后通过bindService()方法,把ServiceConnection实例作为参数传递进去,从而把创建的binder赋值为绑定成功后得到的service中的binder实例。

4)最后,通过binder调用其内部定义好的方法,从而实现Activity与Service的通信。

各种服务类型的使用场景:

【图片来自:http://www.jianshu.com/p/e04c4239b07e】

六:Service与Thread的区别

一般来说,会将Service和Thread联合着用,即在Service中再创建一个子线程(工作线程)去处理耗时操作逻辑。

最新文章

  1. Https 协议
  2. ASP.NET伪静态 UrlRewrite(Url重写) 实现和配置
  3. 消息系统Kafka介绍
  4. Java单例模式深入详解
  5. 如何仿写thinkphp的S方法?
  6. android apk 导出(签名) is not translated in xx 代码混淆 反编译
  7. 【Energy Big Data】能源互联网和电力大数据
  8. lintcode 1: Data Stream Median
  9. Pandas: 如何将一列中的文本拆分为多行? | Python
  10. SSH服务详解
  11. jquery左右折叠框
  12. 记录pycharm快捷键出错的其中一个原因
  13. c# Linq&Lambda
  14. boost-断言
  15. Python图像处理库:Pillow 初级教程-乾颐堂
  16. Android学习之一
  17. XRP节点部署
  18. django数据库操作-增删改查-多对多关系以及一对多(外键)关系
  19. angular -- 无刷新做分页
  20. struts获得参数(属性,对象,模型驱动)

热门文章

  1. Lua date format
  2. Java中CAS详解
  3. android studio运行时报错AVD Nexus_5X_API_P is already running解决办法
  4. [转]使用PHPExcel判别和格式化Excel中的日期格式
  5. System.Reflection.TargetException:“非静态方法需要一个目标。”
  6. 检测Sql Server服务器SQL语句执行情况
  7. centos7安装redis单机版
  8. C++ 友元类使用 (friend)
  9. go语言之进阶篇有缓冲channel
  10. 免费桌面视频录像工具OBS的简单操作介绍