面试过程中经常会遇到一些试题或者面试官问你startService 和 bindService 的区别,今天我们就来分析分析这两种启动service方式的差异

通过startService 启动service
Service会经历 onCreate –> onStart
stopService的时候直接onDestroy

如果是 调用者 直接退出而没有调用stopService的话,Service会一直在后台运行。
下次调用者再起来仍然可以stopService。

通过bindService 启动service
Service只会运行onCreate, 这个时候 调用者和Service绑定在一起

调用者退出了,Srevice就会调用onUnbind–>onDestroyed
所谓绑定在一起就共存亡了。

注意:Service的onCreate的方法只会被调用一次,
就是你无论多少次的startService又 bindService,Service只被创建一次。
如果先是bind了,那么start的时候就直接运行Service的onStart方法,
如果先是start,那么bind的时候就直接运行onBind方法。如果你先bind上了,就stop不掉了,
只能先UnbindService, 再StopService,所以是先start还是先bind行为是有区别的。

startService()和bindService()两种模式是完全独立的。你可以绑定一个已经通过startService()方法启动的服务。例如:一个后台播放音乐服务可以通过startService(intend)对象来播放音乐。可能用户在播放过程中要执行一些操作比如获取歌曲的一些信息,此时activity可以通过调用bindServices()方法与Service建立连接。这种情况下,stopServices()方法实际上不会停止服务,直到最后一次绑定关闭。
如果没有程序停止它或者它自己停止,service将一直运行。在这种模式下,service开始于调用Context.startService() ,停止于Context.stopService(). service可以通过调用Android Service 生命周期() 或 Service.stopSelfResult()停止自己。不管调用多少次startService() ,只需要调用一次 stopService() 就可以停止service。
可以通过接口被外部程序调用。外部程序建立到service的连接,通过连接来操作service。建立连接调开始于Context.bindService(), 结束于Context.unbindService(). 多个客户端可以绑定到同一个service,如果service没有启动, bindService() 可以选择启动它。
这2种模式不是完全分离的。你可以可以绑定到一个通过startService()启动的服务。如一个intent想要播放音乐,通过startService() 方法启动后台播放音乐的service。然后,也许用户想要操作播放器或者获取当前正在播放的乐曲的信息,一个activity就会通过bindService()建立一个到此service的连接. 这种情况下 stopService() 在全部的连接关闭后才会真正停止service。

Android中的服务和windows中的服务是类似的东西,服务一般没有用户操作界面,它运行于系统中不容易被用户发觉,可以使用它开发如监控之类的程序。

服务不能自己运行,需要通过调用Context.startService()或Context.bindService()方法启动服务。
这两个方法都可以启动Service,但是它们的使用场合有所不同。使用startService()方法启用服务,调用者与服务之间没有关连,
即使调用者退出了,服务仍然运行。使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止,大有“不求同时生,必须同时死”的特点。

如果打算采用Context.startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,
接着调用onStart()方法。如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,
但会导致多次调用onStart()方法。采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。

如果打算采用Context.bindService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,
接着调用onBind()方法。这个时候调用者和服务绑定在一起,调用者退出了,系统就会先调用服务的onUnbind()方法,
接着调用onDestroy()方法。如果调用bindService()方法前服务已经被绑定,
多次调用bindService()方法并不会导致多次创建服务及绑定(也就是说onCreate()和onBind()方法并不会被多次调用)。
如果调用者希望与正在绑定的服务解除绑定,可以调用unbindService()方法,调用该方法也会导致系统调用服务的onUnbind()–>onDestroy()方法.

转载地址 http://mp.weixin.qq.com/s?__biz=MzAwOTUyNzI3Ng==&mid=2652070998&idx=1&sn=674a537dccd5e1eae7ece04c658d3ef4&scene=23&srcid=0508sQr1DQiQIFsywhUQlI8k#rd

面试过程中经常会遇到一些试题或者面试官问你startService 和 bindService 的区别,今天我们就来分析分析这两种启动service方式的差异通过startService 启动service Service会经历 onCreate –> onStart stopService的时候直接onDestroy 如果是 调用者 直接退出而没有调用stopService的话,Servic
学习完Activity的启动流程后,接着学习Service的启动流程和 绑定 流程。 1.Service的启动流程 和Activity一样,Service的启动过程我们可以看成两个部分: ContextImpl到AMS的调用过程(从应用程序进程到System Server 进程) ActivityThread启动Service (从System Server 进程回到应用程序进程) 1.1 Context...
前面已经对Service的s tar t Server 方式启动一个服务了解过了,现在来看一下Service的另一种启动方式→ bind Server bind Server 使用场景 1、在同个app之间调用(即是同一个进程中) 2、在不同app之间调用(即是跨进程间通信) 同个app间调用(只有一次启动该服务) Bind erActicityA public class Bind erActi
在Activity中使用 bind Service 绑定 Service时,会调用ContextWrapper的 bind Service方法 http:// android xref.com/9.0.0_r3/xref/frameworks/base/core/java/ android /content/ContextWrapper.java @Override public boolean bind Servi...
文章目录一、梳理Java中NIO代码二、Netty服务端代码1、new NioEventLoopGroup()2、group3、channel4、Nio Server SocketChannel.class5、childHandler6、 bind 一、梳理Java中NIO代码 Java中的NIO其本质是网络层面定义中的多路复用IO模型(一定要和NIO模型区分开)。NIO代码主要分为下列几步: 初始 Server SocketChannel 初始化Selector, 完成Selector和Channel的绑
问题1:首先 bind server 启动服务,可以 绑定 服务  , 然后s tar t server ,可以启动服务, 此时再次调用 bind server 启动服务,都不执行 server 里面的方法了 具体原因不知道,临时解决方法   1,把s tar t server 启动的服务停止stop server ;    2,第一次 bind server 启动的服务结束后,应该主动un bind server ,然后再停止stopse
frameworks/base/services/core/java/com/ android / server /am/ - ActivityManagerService.java - ActiveServices.java - ServiceRecord.java - Pr...
百度google大家多说的是任务管理器 kill掉adb 或者重启adb server ,但我任务管理器就没有adb ,猜测是某个程序占用了adb端口。于是按此思路查找。 5037为adb默认端口 查看该端口情况如下: netstat -aon|findstr "5037" TCP 127.0.0.1:5037 0.0.0.0:0 LISTENING 6540 发现6540占用了 5037端
面试的时候被问到这样一个问题, 绑定 server 之后如果不解绑,程序会Crash吗?我擦,蒙逼了,回去之后试了试,不会异常,但是会泄漏1.异常一:先看一下报的异常吧12-09 21:03:31.596 5771-5771/com.oblivion.changeactivity I/System.out: oncreate 12-09 21:03:31.596 5771-5771/com.oblivio