文章目录
前言
平时的开发中,我们用的最多就是在Activity中进行开发。当我们需要处理一个耗时的逻辑的时候,为防止ANR我们会开启一个子线程来执行,例如网络请求等。但是当我们需要一个逻辑在后台持续运行,并且能和多个活动进行通信,例如后台播放器,子线程貌似就显得无能为力了。这个时候就需要用到服务了。顾名思义,他作为后台逻辑,为前台的Activity服务。接下来看看什么是服务。
什么是service?
简介
服务Service,是Android四大组件之一。服务顾名思义就是用于为前台界面服务的一个组件。当我们把应用放到后台,微信还是可以接受信息,歌曲还是可以播放,这个就是服务完成的。服务用的最多也是后台工作。和作为四大组件的Activity一样,Service也是拥有类似的启动模式,生命周期等等。
服务分类
服务分为前台服务和后台服务两种:前台服务就像平时我们播放音乐的时候通知栏会有一个常驻的通知,然后后台播放歌曲,那个就是前台服务;
后台服务一般我们感受不到,他在后台默默为前台服务,提供数据运算等等。例如当我们使用微信返回桌面的时候,还是可以接受信息,这个就是服务的作用。
代码简析
先看看Service的代码:
public class MyService extends Service {
//构造器。一定要有一个空参数的构造器,不然无法启动成功
public MyService() {
}
//服务被创建的时候会调用。和Activity类似
@Override
public void onCreate() {
super.onCreate();
}
//服务启动的时候会调用
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
//绑定服务的时候会调用这个方法,并返回一个IBinder对象,这里用了内部类的方法
@Override
public IBinder onBind(Intent intent) {
return new MyBinder();
}
//内部类,在这里可以写方法供给绑定的活动使用。Binder是实现IBinder接口的类
class MyBinder extends Binder {
}
}
可以见到只需要建立一个类,并继承service类,即可创建服务。服务作为四大组件之一,和活动也是一样有类似的生命周期。相关的方法我在代码中注释了,看不太懂也没关系,主要先接触一下服务。然后作为四大组件之一,当然也是需要注册的:
<service
android:name=".MyService"
android:enabled="true"
android:exported="true"/>
第一参数表示能否被启动,第二个参数表示能否被隐式启动。
与线程的区别
很多读者可能会有一个误解,就是以为服务和活动不是在同一个线程,直接在服务中执行耗时任务,然后就会发现出现了ANR。服务不就是在后台的吗?实际上,服务是运行在主线程的,他只是整个类在前台界面退出到桌面甚至被销毁,他依然可以存在并运行,但是如果要执行耗时逻辑,则必须在服务中开启一个子线程运行。
启动服务的两种方式
启动服务和启动Activity是类似,都是通过Intent来启动对应的Service。有显式和隐式两种。这里主要介绍显式启动。除此之外服务还有绑定这一种启动方式。来看一下吧:
直接启动
Intent intent = new Intent(this,MyService.class);
startService(intent);
通过代码可以看到直接启动一个服务和直接启动一个活动几乎是一模一样的。区别就是调用的方法不同这也可以理解ÿ