- startService
- 生命周期
- onCrate
- onStartCommand
- onDestroy
- 在多次调用startService的时候,onCreate不重复执行,但是onStartCommand会执行。
- startService调用了这后,会一直存在,直到其调用了stopService。
- 多次调用startService用多次调用stopService吗?只要调用一次stopService()方法便可以停止服务,无论之前它被调用了多少次的启动服务方法。
- bindService
- 生命周期
- onCreate
- onBind
- onUnbind
- onDestroy
- 多次调用bindService,onCreate及onBind都只执行一次。
- 它生命周期跟随其调用者,调用者释放的时候,必须对该Service解绑,当所有绑定全部取消后,系统即会销毁该服务。
- bindService 的方式通过onServiceConnected方法,获取到Service对象,通过该对象可以直接操作到Service内部的方法,从而实现的Service 与调用者之间的交互。
- 通过Context.bindService()方法来绑定服务,Context.unbindService()方法来关闭服务。多个客户端可以绑定同一个服务,如果Service还未被启动,bindService()方法可以启动服务。(调用bringUpServiceLocked启动Service)
- 一个后台播放音乐服务可以通过startService(intend)对象来播放音乐。可能用户在播放过程中要执行一些操作比如获取歌曲的一些信息,此时activity可以通过调用bindServices()方法与Service建立连接。这种情况下,stopServices()方法实际上不会停止服务,直到最后一次绑定关闭。stopservice和unBindService方法执行顺序没有要求,最后一个stopservice和unBindService会导致service的ondestroy执行。
- 多个Activity绑定Service
- 点击ActivityA的bindService按钮
- 第一次调用bindService会实例化TestTwoService,然后执行其onBind()方法,得到IBinder类型的实例,将其作为参数传入ActivityA的ServiceConnection的onServiceConnected方法中,标志着ActivityA与TestTwoService建立了绑定。
- 点击ActivityB中的bindService按钮
- 由于TestTwoService已处于运行状态,所以再次调用bindService不会重新创建它的实例,所以也不会执行TestTwoService的onCreate()方法和onBind()方法。ActivityB与ActivityA共享IBinder实例。此时有两个client与TestTwoService绑定。
- 点击ActivityB中的unbindService按钮
- ActivityB与TestTwoService解除了绑定,当没有任何client与Service绑定时,才会执行Service的onUnbind()方法。此时,ActivityA还在绑定连接中,所以不会执行Service的解绑方法。
- 点击ActivityA中的unbindService按钮
- ActivityA执行unbindService之后,ActivityA与TestTwoService就解除绑定了,这样就没有client与TestTwoService绑定,这时候Android会销毁TestTwoService,在销毁前会先执行TestTwoService的onUnbind()方法,然后才会执行其onDestroy()方法,这样TestService就销毁了。
- 如果client销毁,那么client会自动与Service解除绑定。
- 同时使用startService()启动服务、BindService()绑定服务的生命周期
- onCreate
- onStartCommand
- onBind
- onUnbind
- onStopService
- onDestory
- 如何提高service的优先级?
- 在AndroidManifest.xml文件中对于intent-filter可以通过android:priority = “1000”这个属性设置最高优先级,1000是最高值,如果数字越小则优先级越低,同时实用于广播。
- 在onStartCommand里面调用 startForeground()方法把Service提升为前台进程级别,然后再onDestroy里面要记得调用stopForeground ()方法。
- Service里面可以弹Toast么?
- 弹吐司有个条件就是得有一个Context上下文,而Service本身就是Context的子类,因此在Service里面弹Toast是完全可以的。
- Service 的 onRebind(Intent)方法在什么情况下会执行?
- 如果在 onUnbind()方法返回 true 的情况下会执行,否则不执行。
- 使用场景
- 如果想要启动一个后台服务长期进行某项任务,那么使用startService,如果只是短暂的使用,那么使用bindService。
- 如果想启动一个后台服务长期进行任务,且这个过程中需要与调用者进行交互,那么可以两者同时使用,或者使用startService + BoardCast/ EventBus 等方法。
- 对于既使用startService,又使用bindService的情况,结束服务时需要注意的事项: Service的终止,需要unbindService和stopService都调用才行;
- IntentService
- 启动 IntentService 为什么不需要新建线程?
- HandlerThread 继承自 Thread,内部封装了 Looper,在这里新建线程并启动,所以启动 IntentService 不需要新建线程。
- 为什么多次启动 IntentService 会顺序执行事件,停止服务后,后续的事件得不到执行?
- IntentService 中使用的 Handler、Looper、MessageQueue 机制把消息发送到线程中去执行的,所以多次启动 IntentService 不会重新创建新的服务和新的线程,只是把消息加入消息队列中等待执行,
- 而如果服务停止,会清除消息队列中的消息,后续的事件得不到执行。
- 为什么不建议通过 bindService() 启动 IntentService?
- 如果采用bindService()启动IntentService的声明周期:onCreate() ->> onBind() ->> onunbind()->> onDestory()即,并不会调用onStart或onStartCommand,所以不会将消息发送给消息队列,那么onHandleIntent将不会调用。即无法实现多线程的操作。
- 如何在Service中启动一个Activity
- 需要添加Flag:FLAG_ACTIVITY_NEW_TASK—荣耀Play没有崩溃、红米Note3崩溃
- 给Activity设置:android:excludeFromRecents=“true”—在特定机型会出现最近任务列表有两个app的情况。也可以用于从最近任务列表中隐藏。
- Android中bindService的细节之三:多次调用bindService(),为什么onBind()只执行一次?
- ActiveServices的bindServiceLocked方法做判断
- 第一次App A绑定Service时,创建了IntentBindRecord实例,并记录在AppBindRecord中。执行onBind()后,App B进程通过publishService()将binder传给了AMS,记录在IntentBindRecord实例中,并设置标志位received。
- 第二次App C绑定Service时,获取之前的IntentBindRecord实例,判断标志位received为true,则直接调用App C的onServiceConnected()将binder对象传给App C。所以第二次没有调用onBind()。
- Android中bindService的细节之三:多次调用bindService(),为什么onBind()只执行一次?
- 第一次App A绑定Service时,创建了IntentBindRecord实例,并记录在AppBindRecord中。执行onBind()后,App B进程通过publishService()将binder传给了AMS,记录在IntentBindRecord实例中,并设置标志位received。
- 第二次App C绑定Service时,获取之前的IntentBindRecord实例,判断标志位received为true,则直接调用App C的onServiceConnected()将binder对象传给App C。所以第二次没有调用onBind()。
- 参考:
- Android 面试题之Service(不断更新) www.jianshu.com/p/4dd4ccb80…
- IntentService 示例与详解 www.jianshu.com/p/332b6daf9…
- 深入理解Android的startservice和bindservice www.cnblogs.com/yejiurui/p/…
- Android 清晰理解Service juejin.cn/post/684490…
- Android中bindService的细节之三:多次调用bindService(),为什么onBind()只执行一次? www.jianshu.com/p/9daf99873…