Service入门
1.什么是Service
1.1手机中的Service案例
1.2为什么会有service?
由于手机的原因一个时刻只允许一个激活状态的Activity,其余的处于未激活
后台服务机制应运而生
1.3Service简介
- 四大组件之一
- 没有UI界面,后台服务,长时间运行
- 与Activity是并列关系,都是Context子类
- 可以交互
- 不需要用户干预
1.4功能
- 实现进程之间的通信工作
2.Service和Activity比较
2.1比较
Service | Activity |
可执行程序 | 同上 |
有生命周期 | 同上 |
Context派生 | 同上 |
后台运行 | 反之 |
无UI界面 | 反之 |
不可以主动运行 | 反之 |
2.2选择标准
- 呈现界面需要交互最好是Activity
- 不需要界面考虑Service
2.3Service的应用常见
- 下载任务
- 音乐播放器
- 网络连接服务
- 定时触发任务
3.创建、注册、启动、停止
3.1创建
1.继承Service类
2.Service的生命周期方法以及介绍
public class MyService1 extends Service {
/*
*
* 创建的时候被调用一次,调用完成之后会销毁
* */
@Override
public void onCreate() {
super.onCreate();
}
/*
* 采用startService启动服务的时候调用
* Intent是从客户端传来的数据
* flags是附加数据,表示启动的方式
*startId表示当前服务的唯一的ID的值
* */
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
@Nullable
@Override
/*
* 采用bind的方式启动的时候会被调用
* 返回值是一个IBinder的接口实现类对象(需要自己去定义)
* */
public IBinder onBind(Intent intent) {
return null;
}
/*
*
* 客户端调用unBindService的时候调用,断开改Service上连接的所有客户端
* */
@Override
public boolean onUnbind(Intent intent) {
return super.onUnbind(intent);
}
/*
* 当Service被关闭/销毁的时候调用
* */
@Override
public void onDestroy() {
super.onDestroy();
}
}
3.补充
3.2注册
1.服务创建完成后,要在AndroidManifest.xml文件中注册该Service,否则服务是不生效的。
3.3启动
1.启动方式:2种
- startService,不可以回传数据,无交互
- bindService,可以回传数据,传参、方法调用可以交互
不管怎样Service都是不能自己启动的需要帮忙启动。
2.启动方式比较
- 实际的开发都是bind
Start方式 | Bind方式 |
用startService()来启动 | 用bindService()绑定启动 |
客户端与Service之间没有关联,即使客户端退出了,Service仍然运行,直到自身调用stopSelf()方法或者其他组件调用stopService()方法时服务停止,最终被系统销毁。 | 客户端与Service绑定在一起,所有的客户端退出,Service也就停止,但是只要有一个客户端存在,那么Service继续运行。其它组件通过Context.unbindService()停止服务。 |
客户端和Service之间无法通信,无法进行数据交互 | 客户端和Service之间可以通信,可以进行数据交互 |
3.4start启动方式
1.显式
- 和Activity是类似的
intent=new Intent(this,MyService1.class);
startService(intent);
2.隐式启动
- 必须设置setPackage不然的话会失败
intent=new Intent();
//需要设置app的包名否则无效
intent.setPackage("com.lxz.app9");
intent.setAction("com.lxz.app9Service");
startService(intent);
intent.setPackage("com.android.vending")
注意是程序的包名就是Activity所在的包。
3.5bind方式启动
1.启动过程
- 不同在启动的过程
- 多一个创建conn连接对象的过程
- conn可以也是进行数据回传的接口
2.Service的bind启动
如果我们解除与服务的绑定,只需调用unbindService(),此时onUnbind和onDestory方法将会被调用!这是一个客户端的情况,假如是多个客户端绑定同一个Service的话, 当一个客户端完成和service之间的互动后,它调用 unbindService() 方法来解除绑定。当所有的客户端都和service解除绑定后,系统会销毁service。
当首次使用bindService绑定一个Service时,系统会实例化一个Service实例,并调用其onCreate()和onBind()方法,然后调用者就可以通过IBinder和Service进行交互了,此后如果再次使用bindService绑定Service,系统不会创建新的Sevice实例,也不会再调用onBind()方法,只会直接把IBinder对象传递给其他后来增加的客户端!
3.bindService方法
Context中的绑定方法:
bindService (Intent service,ServiceConnection conn,int flags)
参数说明:
- service:该Intent对象用于指定要启动的service
- conn:该参数是一个serviceConnection对象,用于监听客户端与service之间的连接情况,当调用者与Service连接成功时将回调serviceConnection接口实现类对象conn的onServiceConnected(ComponentName name,IBinder service)方法,如果意外断开将回调onServiceDisConnected(ComponentName name)方法
- flags:指定绑定时是否自动创建service,可指定为0(不自动创建)或BIND_AUTO_CREATE(自动创建)。
3.6混合启动方式
1.启动方式和绑定方式的结合
这两种使用方法并不是完全独立的,在某些情况下可以混合使用
以MP3播放器为例,在后台工作的Service通过Context.startService()启动某个特定音乐播放
但在播放过程中如果用户需要暂停音乐播放,则需要通过Context.bindService()获取服务链接和Service对象
进而通过调用Service的对象中的函数,暂停音乐播放过程,并保存相关信息
在这种情况下,如果调用Context.stopService()并不能够停止Service,需要在所有的服务链接关闭后,Service才能够真正的停止