服务通常有两种形式:
1、Started:通过另一个组件调用 startService()启动,服务可以一直运行,也可以通过自身关闭自己。
2、Bound:通过一个组件调用 bindService()来绑定服务,可以与组件跨进程通信,多个组件可以绑定到服务,当他们全部取消绑定时,服务就会销毁了。
通过onStartCommand() 启动服务,通过 onBind() 绑定服务。
你可以在manifest中生命服务为私有。
注意:服务运行在主线程,如果要执行耗时操作的话,要单独开一个线程。
比较重要的需要重写的回调方法:
1、onStartCommand() 当其他组件调用startService()时,系统会回调这个方法,通过调用stopSelf()或者stopService()来停止服务。(如果你只想提供绑定,就不需要实现这个方法)。
2、onBind() 当其他组件调用bindService()时,系统会回调这个方法,通过返回IBinder来和交互数据,如果你不想被被绑定,你可以返回null。
3、onCreate() 第一次创建服务时,系统会最先调用此方法。
4、onDestroy()
启动和停止的方式:
1、如果通过 startService()启动服务,可以通过自己调用stopSelf()或者其他组件调用stopService()来停止服务
2、如果通过 bindService()来创建服务(onStartCommand()不会被调用),服务会一直运行,直到取消绑定,系统就会销毁此服务了。
系统什么时候会杀死服务
只有当系统内存过低,才会强制停止服务。如果服务绑定在用户正在使用的activity上,服务被杀死的可能性会更低。如果服务声明在前台运行,那它几乎不会被销毁。如果服务运行了很长时间,系统会降低他在后台任务列表的位置,从而使它被杀死的可能性增高。在你的服务启动之后,你必须设计来让系统重启它,如果系统杀死了你的服务,你可以尽快的让服务重启(但这也取决于你onStartCommand()返回值)。
为了确保你的服务是安全的,不要在服务里声明intent filters,启动和绑定服务时,使用明确的intent。如果你允许通过模糊的方式启动服务,你可以声明intent filters并且包括组件的名称,但是你必须使用 setPackage()方法来给intent设置包名,使得目标服务没有歧义。
如果你只想自己使用你的服务,你应该设置 android:exported为false,这样即使其他的服务通过明确的意图,也不能启动你的服务。