第一种: 开启完服务之后, 就跟服务没关系了. 不管服务的死活了.
startService 开启服务, 生命周期显示: onCreate -> onStartCommand 服务正在运行了.
当服务已经在后台运行, 无论调用多少次startService都不会重新创建服务, 而是调用onStartCommand
stopService 停止服务, 当服务正在后台运行, stopService会把服务关掉, 生命周期: onDestory
注 : 这种方式开启服务, 不可以调用服务中的方法.
第二种: 可以调用服务中的方法, 当前的activity开启的service, 它俩的关系是, 不求同时生, 但求同时挂.
bindService 绑定服务 , 生命周期: onCreate -> onBind 服务正在运行了.
unbindService 解绑服务. 生命周期: onUnbind -> onDestory 服务被销毁了.
调用服务中的方法:
1. 调用bindService方法, 绑定服务. 同时传递过去一个ServiceConnection连接桥. 并实现其中两个方法onServiceConnected.
2. 自定义一个实现IBinder对象或者继承Binder类, 在onBind方法中返回这个对象.
3. ServiceConnection连接桥中的onServiceConnected方法会被调用, 其中有个对象IBinder service, 就是服务返回来的对象
4. 在自定义的类中写个方法, 转调服务中的方法.
5. 在activity中拿着服务连接桥返回过来的对象, 调用服务中的方法.
远程服务调用:
IPC: intel-process communication 因特尔进程间通信.
AIDL android interface dinfiend language 安卓接口声明语言. 不允许接收修饰词.
Binder类是实现了IBInder接口的类.
1. 在远程服务的应用程序中定义一个接口类, 把修饰词去掉. 把后缀名改成aidl
2. 如果没有错误, 会在我们的Gen目录下生成一个文件接口名.java
3. 在我们的服务中创建一个内部类, 继承gen目录下生成的接口文件中的Stub类.
4. 在Stub实现类中写一个方法, 用于转调服务中的买票方法.
5. 在清单文件中service的节点下加隐式跳转的action参数. 用于让远程服务调用我们. ---------------服务端基本完成.
6. 在另一个应用程序中调用bindService方法绑定服务. 并且传递过去一个ServiceConnection连接桥.
7. 把远程服务中的aidl文件拷贝到我们应用程序中. 新建一个和aidl包名一样的包, 放进去. 这时候gen目录下会生成对应的接口名.java的文件.
8. 在ServiceConnection连接桥的onServiceConnected方法中, 把服务返回过来的IBinder对象转换成IRemoteService对象.
IRemoteService iRemoteService = Stub.asInterface(service);
9. 拿着获取的 iRemoteService 对象调用服务中的方法.
混合开启服务方式: 开启一次服务, 服务就一直在后台运行. 别人过来绑定就可以随便使用, 解绑之后也不会把服务关闭掉.
startService 服务在后台运行
捕鱼达人: 绑定, 付钱, 解绑
植物大战僵尸: 绑定, 付钱, 解绑
找你妹: 绑定, 付钱, 解绑
.......
在工作中, 如果写一个服务, 需要被别人调用, 并且还需要长期在后台运行. 就采用混合开启服务的方式运行服务.