美文网首页Android 知识点
Android Service组件常见问题总结

Android Service组件常见问题总结

作者: 怡红快绿 | 来源:发表于2018-12-25 15:58 被阅读0次

Service是一个应用程序组件,它能够在后台执行一些耗时较长的操作,并且不提供用户界面。服务能被其它应用程序的组件启动,即使用户切换到另外的应用时还能保持后台运行。此外,应用程序组件还能与服务绑定,并与服务进行交互,甚至能进行进程间通信(IPC)。 比如,服务可以处理网络传输、音乐播放、执行文件I/O、或者与content provider进行交互,所有这些都是后台进行的。

image.png

1、如果一个应用程序组件(比如一个activity)通过调用startService()来启动服务,则该服务就是被“started”了。一旦被启动,服务就能在后台一直运行下去,即使启动它的组件已经被销毁了。 通常,started的服务执行单一的操作并且不会向调用者返回结果。比如,它可以通过网络下载或上传文件。当操作完成后,服务应该自行终止。

  • 如果Service还没有运行,那么Service生命周期为onCreate->onStartCommand ->onDestroy
  • 如果Service已经被启动,那么系统只会调用onStartCommand回调方法,所以onStartCommand方法是可以多次回调的
  • 可以使用context.stopService方法停止Service运行,系统会调用onDestroy方法
  • 即使启动Service的组件(比如Activity)自行结束了自己的生命周期,Service依然会在后台继续运行

2、如果一个应用程序组件通过调用bindService()绑定到服务上,则该服务就是被“bound”了。bound服务提供了一个客户端/服务器接口,允许组件与服务进行交互、发送请求、获取结果,甚至可以利用进程间通信(IPC)跨进程执行这些操作。绑定服务的生存期和被绑定的应用程序组件一致。 多个组件可以同时与一个服务绑定,不过所有的组件解除绑定后,服务也就会被销毁。

  • onBind将返回给客户端一个IBind接口实例,IBind允许客户端回调服务的方法,比如得到Service运行的状态或其他操作。这个时候调用者(Context,例如Activity)会和Service绑定在一起,Context退出了,Srevice就会调用onUnbind->onDestroy相应退出。 所以调用bindService的生命周期为:onCreate --> onBind(只一次,不可多次绑定) --> onUnbind --> onDestory。一但销毁activity它就结束,如果按home把它放到后台,那他就不退出。
  • 在Service每一次的开启关闭过程中,只有onStart可被多次调用(通过多次startService调用),其他onCreate,onBind,onUnbind,onDestroy在一个生命周期中只能被调用一次。

3、提高Service优先级

  • 提高优先级:在AndroidManifest.xml文件中设置android:priority属性,1000是最高值,如果数字越小则优先级越低,同时适用于广播。
<service android:name=".service.LocalService" >
    <intent-filter android:priority="1000">
    </intent-filter>
</service>
  • 声明为前台服务:在onStartCommand里面调用 startForeground()方法把Service提升为前台进程级别,然后再onDestroy里面要记得调用stopForeground ()方法
  • 结合Broadcast:在服务销毁执行onDestroy方法时发送自定义广播,在广播内启动Service
  • 销毁后主动重启:在onStartCommand方法中返回START_STICKY
  • 通过系统的一些广播,比如:手机重启、界面唤醒、应用状态改变等等监听并捕获到,然后判断我们的Service是否还存活,非存活状态下唤醒服务

4、onStartCommand() 方法返回值含义

  • START_STICKY(粘性) :如果在执行完 onStartCommand 后服务被系统杀死,系统依然会保留服务状态为开始状态,并且会在适当的时机重新启动该服务。一定会调用onStartCommand方法,如果在此期间没有任何启动命令被传递到 service,那么参数 Intent 将为null
  • START_NOT_STICKY (非粘性):如果在执行完 onStartCommand 后服务被系统杀死,之后系统不会自动重启该服务
  • START_REDELIVER_INTENT:如果在执行完 onStartCommand 后服务被系统杀死,系统会自动重启该服务,并将 Intent 的值传入
  • START_STICKY_COMPATIBILITY: START_STICKY 的兼容版本,但不保证服务被 kill 后一定能重启

相关文章

网友评论

    本文标题:Android Service组件常见问题总结

    本文链接:https://www.haomeiwen.com/subject/inizkqtx.html