一、startService的实现步骤:
1.创建一个自定义类继承Service类(如此方为服务类)
2.在配置清单文件里的<application>下注册. (忘记注册,不会报异常,只会有一个黄色警报,no found)
<service android:name="包名.类名" ></service>
(可以配 <intent-filter>,像Activity一样有隐式启动,显式启动)
3.复写onCreate方法,服务开启时调用此方法进行操作.(主要是在此方法里编写服务初始化的逻辑代码)
public void onCreate() {...super.onCreate();}//一般自己的代码写在super.onCreate这段代码上面,可以减少bug.
4:复写onStartCommand方法,服务被创建或再次点击开启服务时调用此方法进行操作.(对服务进行操作的逻辑代码,比如音乐暂停,播放等)
其中的intent参数就是,Activity里的开启服务时携带的Intent参数,传到了onStartCommand里,可进行Activity与Service的数据传递
public int onStartCommand(Intent intent, int flags, int startId)
5.复写onDestroy方法,服务销毁时调用此方法释放内存.
public void onDestroy() {........super.onDestroy();}
注意:即使应用程序退出,如果没有执行onDestroy方法,服务依然不会关闭,除非结束当前线程。另外,服务是运行在主线程里面(main),而主线程不能进行耗时的操作,在服务里的耗时操作要放到子线程中。
在Activity里开启服务(使用的是显示意图):
创建意图对象
Intent intent= new Intent();
调用意图对象,加载服务类到意图中.
intent.setClass(this,服务类.class);
运行意图(实际上也不能算开启服务,只是执行了服务的onCreate方法)
startService(intent);//开启Activity就是startActivity()方法
简写模式:startService(new Intent(this,服务类.class));
在Activity里关闭服务(使用的是显示意图):
创建意图意图对象
Intent intent= new Intent();
调用意图对象,加载服务类到意图中.
intent.setClass(this,服务类.class);
运行意图(实际上也不能算开启服务,只是执行了服务的onDestroy方法
stopService(intent);
注意:服务的开启,关闭都要在Activity里去完成,他自身是不可以开启或关闭,由此可以看出服务依赖于应用程序.
二、bindService的实现步骤:
首先,在Service里创建Binder步骤
1.自定义一个类继承Binder(是IBinder的子类),之所以不实现接口IBinder,是因为要复写其太多抽象方法.
class xxx extends Binder{}
2.在xxx(继承Binder的自定义类)里,自定义方法,这些方法主要是为了调用Service里的方法,故方法所需参数要包含Service里的方法所需参数
class xxx extends Binder{
public void 自定义方法(String name){
服务里自定义的方法(name);} }
3.在服务类里必有的onBind方法里,把继承Binder的自定义类,return返回回去.切记切记,最容易忘记.
public IBinder onBind(Intent intent) {
return new xxx();}
4.在服务类还要复写onUnbind方法,用来解除绑定服务的方法.
public boolean onUnbind(Intent intent) { return super.onUnbind(intent); }
其后,在Activity里使用Binder步骤:
1.定义好Intent意图.
Intent intent = new Intent(上下文,Service类.class);
2.使用Activity里的静态方法,bindService绑定服务.(核心一步,实际是调用Service里的onBind方法)
sercice:一个有上下文,及要使用到的Service.class数据的Intent conn:通讯频道.实现ServiceConnection的自定义类对象.
bindService(Intent , conn, flags)//flags:参数一般是BIND_AUTO_CREATE,表示如果服务不存在,会自动把服务创建出来.
3.创建通讯频道,以便传给bindService,自定义一个类实现ServiceConnection
private class conn implements ServiceConnection{}
4.复写实现ServiceConnection的自定义类的两个方法,
private class conn implements ServiceConnection{
//当服务被成功连接的时候调用的方法,参数是一个IBinder
public void onServiceConnected(ComponentName name, IBinder service) {
继承Binder类的自定义类 继承Binder类的自定义类对象= (局长女儿名字,也就是继承Binder类的自定义类) service;
}//最好把继承Binder类的自定义类提升为全局变量.方便调用.
//当服务失去连接的时候调用的方法.
public void onServiceDisconnected(ComponentName name) {}
}
5.通过继承Binder类的自定义类对象,调用其方法,间接调用Service里方法.
6.使用Activity里的静态方法unbindService()解除绑定服务.(核心一步,实际是调用Service里的onUnbind方法)
三、绑定服务的优化
绑定服务的一种特殊情况(使用接口,是固定模式的优化):当在继承Binder类的自定义类,有了一些不想让Activity调用的方法,把类权限改为private时,怎么在Activity调用Binder类想要暴露出去的方法呢?
1.定义一个接口,public interface 名字自定义();
2.在接口类里写Binder类需要暴露出去的抽象方法,和Binder类想要暴露出去的方法名,参数,返回值类型一致.
3.在Service类里的Binder类不仅继承(extends)Binder还要实现(implements)自定义的接口.
4.Activity里所有所用到Binder的类型都要改为自定义接口的类型,这要就可以只调用Binder类里暴露方法,而无法调用Binder类没有暴露的方法