#.两种启动模式下的生命周期示例图
![](https://i-blog.csdnimg.cn/blog_migrate/21e12509827a2b89a95f2f7b0d3e678d.png)
#.两种启动模式
##.两种模式
两种运行模式:直接启动 or 绑定,对应的生命周期如上图所示。
大概总结:
模式一:
调用方无法与Service有效通信。startService()激活,stopService()关闭。
这种方式启动Service后,Service自行进行其生命周期中的任务,外界无法与其继续进行交互。
(注:Android8.0以后,新增
startForegroundService()方法,可以用来启动前台服务,
但要在Service启动时,内部需要调用startForeground()来弹出一个通知,否则会报错。具体配置,可以参考本文后面的内容。)
模式二:
调用方可以与Service进行通信。多个调用方可以绑定同一个Service,只有所有调用方都解绑定了,Service才销毁。
这种方式启动Service,可以在回调中拿到Binder对象,进而可以后继与Service进行各种交互。
bindService( Intent, ServiceConnection, 连接方式);//绑定时,与ServiceConnection连接对象相关联
会触发Service生命周期中的onBind()方法,该方法返回一个Binder对象
——> 会触发上面ServiceConnection的 onServiceConnection(Binder)方法,并作为参数传入。
从而,调用方Activity可以获取到Service返回的Binder对象,进而通过调用Binder对象的方法 在Service中执行一些逻辑。
unBindService(ServiceConnection);//解除指定的绑定
(Service只是一个没有UI,运行在后台的组件而言,按照普通方式生成和注册的本地Service仍然是运行在app进程的主线程中的。
只有远程Service才是运行在其它进程中,那需要写相应的aidl脚本并在AndroidManifest.xml文件中声明Service时进行相应处理。
相应参考: android-Service和Thread的区别 - 路人浅笑 - 博客园)
##.代码示例
1.直接启动