在Android中Service是用来进行后台数据处理的东西,类似于Linux下的后台进程,就是当前活动创建的Service在这个活动窗口退出后Service还是继续运行的,我们要对用户的行动进行跟踪,就要长时间采集GPS发送过来的地理位置信息,这样的东西写成一个Service再合适不过了。自己编写的Service要继承系统的Service类,然后Override其中的方法。
服务可以分为本地服务和远程服务
绑定本地服务调用方法的步骤:
- 在服务的内部创建一个内部类 提供一个方法,可以间接调用服务的方法private class MiddlePerson extends Binder implements IMiddlePerson{}
- 实现服务的onbind方法,返回的就是中间人 MiddlePerson
- 在activity 绑定服务。bindService();
- 在服务成功绑定的时候 会执行一个方法 onServiceConnected 传递过来一个 IBinder对象
- 强制类型转化 调用接口里面的方法。
绑定远程服务调用方法的步骤:
- 在服务的内部创建一个内部类 提供一个方法,可以间接调用服务的方法
- 把暴露的接口文件的扩展名改为aidl文件 去掉访问修饰符 publicprivate class MiddlePerson extends IMiddlePerson.Stub{} IPC的子类
- 实现服务的onbind方法,返回的就是中间人 IMiddlePerson
- 在activity 绑定服务。bindService();
- 在服务成功绑定的时候 会执行一个方法 onServiceConnected 传递过来一个 IBinder对象
- IMiddlePerson.Stub.asInterface(binder) 调用接口里面的方法。
一、采用start的方式开启服务
生命周期如下:
onStart()过时了
开启服务: onCreate()--> onStartCommand() ---> onDestory();
如果服务已经开启,不会重复的执行onCreate(), 而是会调用onStart()和 onStartCommand();
只能手动的调用stopService();或者在手机里停掉服务
服务停止的时候调用 onDestory().
服务只会被停止一次
一旦服务开启跟调用者(开启者)就没有任何关系了。
开启者退出了,开启者挂了,服务还在后台长期的运行。
开启者没有办法去调用服务里面的方法
二、服务还有一种开启方式,绑定的方式开启服务。
onCreate() --->onBind();--->onServiceConnected()-->onunbind()-->onDestory();
绑定服务不会调用onstart或者onstartcommand方法;
如果服务已经绑定,不会重复的执行onBind(), 而是会调用onServiceConnected()
bind的方式开启服务,绑定断开,调用者挂了,服务也会跟着停掉。
开启者可以调用服务里面的方法。
三、混合调用的服务的生命周期,bind+start
onCreate() --->onStartCommand()--->onBind()--->onServiceConnected()-->onunbind()-->onDestory();
服务既能长期后台运行,又能调用服务的方法。
绑定断开,调用者挂了,服务也不跟着挂掉 ,继续长期在后台运行,只能手动的调用stopService();或者在手机里停掉服务
调用者能调用服务里的方法