目录
1、基础知识
(1.1)定义
服务是实现后台运行的解决方案,适合执行那些不需要用户交互且需要长期运行的任务。即使程序被切换到后台,或者打开另一个程序,服务依然能够正常运行。但是服务是依赖创建服务时所在的应用进程,当应用进程被杀掉时,服务也会停止。另外服务中的代码默认运行在主线程中,如果需要执行耗时操作需要在服务内部创建子线程执行,否则可能出现ANR。
(1.2)作用
提供后台长期运行任务,比如耗时计算,音乐播放,下载等
2、生命周期
服务提供了如下几个生命周期内可回调的方法onCreate()、onStartCommand()、onBind()和onDestory()。
当调用了Context的startService()方法,相应的服务就会启动起来,并回调onStartCommand()方法。如果这个服务之前还没创建过,onCreate方法会优先于onStartCommand方法执行。服务启动后会一直保持运行状态,直到stopService或stopSelf方法被调用。每次调用startService方法,onStartCommand就会执行一次,但onCreate只会执行一次。
还可以调用Context的bindService()来获取一个服务的持久连接,这时就会回调服务的onBind()方法。如果服务还没创建,则onCreate方法会先于onBind方法执行。
当调用了startSevice方法后,又去调用stopService方法,这时服务中的onDestory方法就会执行。类似的,当调用了bindService后,又去调用unbindService方法,onDestory方法也会执行。需要注意,当调用了startService后又调用了bindService方法,需要同时调用stopService和unbindService方法,onDestory才会执行。
3、基本用法
3.1 定义一个服务
新建一个类,并继承Service类,并实现类的方法onCreate、onStartCommand、onDestory,者三个方法是最常用的,其中onCreate方法会在服务创建时调用,onStartCommand方法会在每次服务启动时调用。
通常,如果希望服务一起动就去执行某个动作,可以把逻辑写在onStartCommand中。另外每个服务都需要在AndroidManifest.xml中注册才能生效。
public class MyService extends Service {
@Override
public IBinder onBind(Intent intent) {
throw new UnsupportedOperationException("Not yet implemented");
}
@Override
public void onCreate() {
System.out.println("onCreate=========");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
System.out.println("onStartCommand=========");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
System.out.println("onDestroy=========");
}
}
<service
android:name=".MyService"
android:enabled="true"/>
3.2 启动和停止服务
调用Context的startService方法启动服务,调用Context.stopService方法停止服务,也可以在Service的任意位置调用调用stopSelf方法来停止服务
private void start() {
Intent intent = new Intent(this, DownService.class);
startService(intent);
}
private void stop() {
Intent intent = new Intent(this, DownService.class);
stopService(intent);
}
3.3 活动和服务进行通信
我们在活动里调用startService方法来启动Service后,onCreate和onStartCommand方法得到执行。之后服务一直处于运行状态,但具体运行什么逻辑,活动控制不了。可以借用onBind方法来使得活动和服务关联起来
public class MyService extends Service {
class MyBinder extends Binder {
public void startDownload() {
System.out.println("startDownload");
}
public void stopDownload() {
System.out.println("stopDownload");
}
}
private MyBinder binder = new MyBinder();
@Override
public IBinder onBind(Intent intent) {
return binder;
}
}
可以看到,我们新建了一个MyBinder类,继承Binder,在类中定义了开始下载和停止下载的方法。接着在MyService类中创建了MyBinder实例,并在onBind()方法里返回了这个实例。下面看下在Activity中如何去调用服务中的这些方法
private ServiceConnection myConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
MyService.MyBinder myBinder = (MyService.MyBinder) iBinder;
myBinder.startDownload();
myBinder.stopDownload();
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
}
};
private void bind() {
Intent intent = new Intent(this, DownService.class);
bindService(intent, myConnection, BIND_AUTO_CREATE);
}
private void unbind() {
unbindService(myConnection);
}
首先创建了一个ServiceConnection匿名类,重写了onServiceConnected方法和onServiceDisConnected方法,这两个方法会在活动与服务成功绑定和接触绑定时调用。在onServiceConnected方法中,我们通过向下转型得到了MyBinder实例,就可以调用该实例中的方法了。
活动和服务绑定通过调用bindService方法,该方法接收三个参数,第一个是Intent对象,第二个是ServiceConnection实例,第三个是BIND_AUTO_CREATE表示活动和服务绑定后自动创建服务。
解除绑定通过调用unbindService方法,接收一个ServiceConnection实例