android Service服务

来源:互联网 发布:山村诡事以知天命 编辑:程序博客网 时间:2024/04/30 14:24

Service服务,在android中,当我们用到这个组件时,它可能在后台处理着一些耗时的操作,或者像系统服务那样的一些需要长期执行的操作。作为四大组件之一,要对它的基本用法与理解有一定的深度。

1.Service 运行方式分类

Service按运行方式可分成Local Service 和 Remote Service两种
Local Service :这类的服务是依托在主进程的,而非像另外一种是在独立进程的,所以一旦主进程被kill后,服务就会终止。可联系到目前的音乐器播放服务。

Remote Service:称为远程服务,这种服务是开在独立的进程的,即对应进程名格式为所在包名加上你指定的 android:progress。因为是在独立的进程,所以主进程的状态变化是影响不到远程服务的,这类服务的运行场景主要是像系统服务,常驻性的。

ps:若按使用方式可分两类,startService启动的服务与bindService启动的服务,一个是不进行通信的,一个会被进行通信,具体可看以下内容。

2.认识
先来看一张“早就用烂”的好图
这里写图片描述

如图
1.当用startService启动一个服务时,会调用Service中的onCreate()和onStartCommand方法。若这时在外面再次启动一个相同的服务,这时,只会调用到onStartCommand(),这时因为onCreate()只会在Service第一次被创建的时候调用,当你要停止服务时,调用stopService()即可。
2.bindService的使用,可以关联Activity和Service,当bindService()时,会执行到onCreate(),但onStartCommand()不会执行,只会去调用onBind()函数。当要解除这种关联时,调用一下unbindSerVice()就可以了。
3.startService 同时也 bindService 启动的服务,停止服务应同时使用stepService与unbindService,否则这个服务会一直存在。

提高 Service 优先级
Android 系统对于内存管理有自己的一套方法,为了保障系统有序稳定的运信,系统内部会自动分配,控制程序的内存使用。当系统觉得当前的资源非常有限的时候,为了保 证一些优先级高的程序能运行,就会杀掉一些他认为不重要的程序或者服务来释放内存。这样就能保证真正对用户有用的程序仍然再运行。如果你的 Service 碰上了这种情况,多半会先被杀掉。但如果你增加 Service 的优先级就能让他多留一会,我们可以用 setForeground(true) 来设置 Service 的优先级。

为什么是 foreground ? 默认启动的 Service 是被标记为 background,当前运行的 Activity 一般被标记为 foreground,也就是说你给 Service 设置了 foreground 那么他就和正在运行的 Activity 类似优先级得到了一定的提高。当让这并不能保证你得 Service 永远不被杀掉,只是提高了他的优先级。

关于Service生命周期

Android Service生命周期与Activity生命周期是相似的,但是也存在一些细节上也存在着重要的不同:

onCreate和onStart是不同的

通过从客户端调用Context.startService(Intent)方法我们可以启动一个服务。如果这个服务还没有运行,Android将启动它并且在onCreate方法之后调用它的onStart方法。如果这个服务已经在运行,那么它的onStart方法将被新的Intent再次调用。所以对于单个运行的Service它的onStart方法被反复调用是完全可能的并且是很正常的。

onResume、onPause以及onStop是不需要的

回调一个服务通常是没有用户界面的,所以我们也就不需要onPause、onResume或者onStop方法了。无论何时一个运行中的Service它总是在后台运行。

onBind

如果一个客户端需要持久的连接到一个服务,那么他可以调用Context.bindService方法。如果这个服务没有运行方法将通过调用onCreate方法去创建这个服务但并不调用onStart方法来启动它。相反,onBind方法将被客户端的Intent调用,并且它返回一个IBind对象以便客户端稍后可以调用这个服务。同一服务被客户端同时启动和绑定是很正常的。

onDestroy

与Activity一样,当一个服务被结束是onDestroy方法将会被调用。当没有客户端启动或绑定到一个服务时Android将终结这个服务。与很多Activity时的情况一样,当内存很低的时候Android也可能会终结一个服务。如果这种情况发生,Android也可能在内存够用的时候尝试启动被终止的服务,所以你的服务必须为重启持久保存信息,并且最好在onStart方法内来做。

1 0
原创粉丝点击