一、什么是服务
- 服务(Service)是Android中实现程序后台运行的解决方案。换句话说,服务就是后台,但是后台并不意味着子线程。
- 服务的运行不依赖于任何用户界面,即使程序被切换到后台,或者用户打开了另外一个应用程序,服务仍然能够保持正常运行,所以非常适合去执行那些不需要和用户交互而且还要求长期运行的任务。
- 服务依赖于创建服务时所在的应用程序进程。
- 服务不会主动开启线程,默认代码运行在主线程中,所以需要在服务的内部手动创建子线程,并在这里执行具体的任务。
二、怎么用服务
1、定义一个服务
在AndroidStudio中直接新建一个Service,注意在AndroidManifest.xml中已经注册过。
2、重写服务方法
- public void onCreate();
在服务被创建的时候调用。(此时服务未创建或者已停止) - public int onStartCommand(Intent intent,int flags,int startId);
在每次服务启动的时候调用。 - public void onDestory();
在服务销毁的时候调用。
stopSelf()方法可以自我停止。 - public IBinder onBind(Intent intent);
返回一个IBinder对象。
将服务的某一模块功能交给Binder管理。
3、服务的一些使用技巧
(1)活动与服务的绑定
(a)将某一部分想要交给活动处理的逻辑封装进Binder对象中,重写onBind()方法。
(b)在活动中实例化ServiceConnection对象,重写onServiceConnected(ComponentName name,IBinder service)方法,IBinder对象为onBind返回。在第一个方法中可以调用Binder对象中的方法。
(c)在活动中调用方法bindService和unbindService方法。
有一个问题就是一个服务可以与多个活动进行绑定,获取到的是同一个IBinder实例。
(2)使用前台活动
当我们希望服务可以不被系统自动回收掉的时候,可以考虑使用前台服务。前台服务会一直有个图标在状态栏,下拉可以看到详细信息。像是天气之类的功能经常使用前台服务。
- 在使用时只需要调用方法startForeground(int,Notification);第一个参数是id。
(3)多线程执行后台方法
public int onStartCommand(Intent intent,int flags,int startId){
new Thread(new Runnable(){
public void run(){
//处理具体的逻辑
stopSelf();
}
}).start();
return super.onStartCommand(intent,flags,startId);
}
可以利用上述代码在后台中开启子线程处理耗时的逻辑,但是android官方也为我们封装了IntentService类,更加优雅的使用服务。内部操作逻辑实际上和Service类一样,只是在线程上自动帮我们处理了。
4、服务的一些概念
(1)生命周期
- 一个服务只要被启动或者被绑定了之后,就会一直处于运行状态,必须要让以上两种条件同时不满足,服务才会被销毁。
- startService()会启动相应服务,并调用onCreate()方法和onStartCommand()方法,如果这个服务正在运行,则只会启动onStartCommand()方法。
- bindService()会绑定相应服务,如果这个服务之前未曾创建,则会先调用onCreate()和onStartCommand(),再调用onBind()。
- stopService()和unbindService()会对应结束相应的服务,执行onDestroy()方法。(必须满足第一个原则:同时不满足)