android服务,android服务的生命周期

android 开启服务

开启服务有两种方式: startService 和 bindService 。

成都创新互联公司专注于企业营销型网站、网站重做改版、建湖网站定制设计、自适应品牌网站建设、H5场景定制成都商城网站开发、集团公司官网建设、外贸网站建设、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为建湖等各大城市提供网站开发制作服务。

首先在 AndroidManifest.xml 文件中声明

启动服务:

开启服务时,调用一次 startService() ,生命周期执行的方法依次是: onCreate() == onStartCommand();

调用多次 startService() , onCreate() 只有第一次会被执行,而 onStartCommand() 会执行多次。

该方式需要一个 ServiceConnection 接口的实现类对象

MyServiceConnection.java :

MyService.java :

启动服务:

bindService 开启服务,生命周期执行的方法依次是:

onCreate() == onBind() == onServiceConnected();

调用多次 bindService() , onCreate() 和 onBind() 都只在第一次会被执行, onServiceConnected() 会执行多次。

Android 服务的限制

Google官网将Android服务分为了三种,前台服务,后台服务和绑定服务:

前台服务执行一些用户能注意到的操作。例如,音频应用会使用前台服务来播放音频曲目。前台服务必须显示 通知 。即使用户停止与应用的交互,前台服务仍会继续运行。

后台服务执行用户不会直接注意到的操作。例如,如果应用使用某个服务来压缩其存储空间,则此服务通常是后台服务。

当应用组件通过调用 bindService() 绑定到服务时,服务即处于 绑定 状态。绑定服务会提供客户端-服务器接口,以便组件与服务进行交互、发送请求、接收结果,甚至是利用进程间通信 (IPC) 跨进程执行这些操作。仅当与另一个应用组件绑定时,绑定服务才会运行。多个组件可同时绑定到该服务,但全部取消绑定后,该服务即会被销毁。

我个人理解服务可以分为两种, 前台 和 后台 ,而 绑定 应该是被当作一种状态,因为 前台服务 和 后台服务 都可以进行绑定。

基于这个理解,我们将限制分成了前台和后台两个部分:

从 Android 5.0(API 级别 21)开始,如果使用隐式 Intent 调用 bindService() ,则系统会抛出异常。为确保应用的安全性,在启动 Service 时,请始终使用显式 Intent,且不要为服务声明 Intent 过滤器。

在后台中运行的 Service 会消耗设备资源,这可能会降低用户体验。 为了缓解这一问题,系统对这些 Service 施加了一些限制。

处于前台时,应用可以自由创建和运行前台与后台 Service。

Android 8.0 开始:系统不允许后台应用创建后台 Service。否则该函数将引发一个 IllegalStateException。

Android 8.0 开始:进入后台时,在一个持续数分钟的时间窗内,应用仍可以创建和使用 Service。 在该时间窗结束后,应用将被视为处于 空闲 状态。 此时,系统将停止应用的后台 Service,就像应用已经调用 Service 的 Service.stopSelf() 方法一样。

为了解除这种限制,可以使用 JobScheduler 作业替换后台 Service。

在 Android 8.0 之前,创建前台 Service 的方式通常是先创建一个后台 Service,然后将该 Service 推到前台。

而在Android 8.0 之后,系统不允许后台应用创建后台 Service。

解决方案:调用 startForegroundService() ,以在前台启动新 Service。

在系统创建 Service 后,应用有五秒的时间来调用该 Service 的 startForeground() 方法以显示新 Service 的用户可见通知。 如果应用在此时间限制内 未 调用 startForeground() ,则系统将停止此 Service 并声明此应用为 ANR 。

前台服务必须显示优先级为 PRIORITY_LOW 或更高的 状态栏通知 ,这有助于确保用户知道应用正在执行的任务。如果某操作不是特别重要,因而您希望使用最低优先级通知,则可能不适合使用服务;相反,您可以考虑使用 计划作业 。

在 Android 9 (API 28)之后,使用前台服务必须申请 FOREGROUND_SERVICE 权限,否则会报 SecurityException 。 这是普通权限,因此,系统会自动为请求权限的应用授予此权限。

每个运行服务的应用都会给系统带来额外负担,从而消耗系统资源。如果应用尝试使用低优先级通知隐藏其服务,则可能会降低用户正在主动交互的应用的性能。因此,如果某个应用尝试运行拥有最低优先级通知的服务,则系统会在抽屉式通知栏的底部调用出该应用的行为。

以 Android 12 为目标平台的应用在后台运行时无法再启动 前台服务 。

在 Android 11 及以后,系统对前台服务何时可以访问设备的位置、摄像头或麦克风进行了限制。

如果您的应用以 Android 11 或更高版本为目标平台,且在前台服务中访问摄像头或麦克风,则必须添加 前台服务类型 camera 和 microphone 。

如果你的应用 在后台运行时启动了某项前台服务 :

如果某服务的功能(位置、麦克风 和 相机)受到了限制,则Logcat中会打印如下语句:

android前台服务以及通知

前台服务是那些被认为用户知道(用户认可所认可)且在系统内存不足的时候 不允许系统杀死 的服务。前台服务 必须给状态栏提供一个通知 ,它被放到正在运行(Ongoing)标题之下——这就意味着 通知只有在这个服务被终止或从前台主动移除通知后才能被解除。

Notification支持文字内容显示、震动、三色灯、铃声等多种提示形式,在默认情况下,Notification仅显示消息标题、消息内容、送达时间这3项内容。

Notification:通知信息类,它里面对应了通知栏的各个属性。

NotificationManager : 状态栏通知的管理类,负责发通知、清除通知等操作。

构建通知的步骤:

更新通知

要想更新通知,需要利用 NotificationManager.notify()

的id参数,该id在应用内需要唯一。要想更新特定id的通知,只需要创建新的Notification,并发出与之前所用 id 相同的 Notification。 如果之前的通知仍然可见,则系统会根据新的 Notification 对象的内容更新该通知。相反,如果之前的通知已被清除,系统则会创建一个新通知。

删除通知

删除通知可以有多种方式:

1.通过 NotificationCompat.Builder 设置 setAutoCancel(true) ,这样当用户点击通知后,通知自动删除。

2.通过 NotificationManager.cancel(id) 方法,删除指定 id 的通知

3.通过 NotificationManager.cancelAll() 方法,删除该应用的所有通知

关于前台服务和通知更具体的内容可参考 紫豪

Android基础:Service —— 默默为你服务

Service有两种启动方式,分别为 context.startService() 和 context.bindService() 。这里要提到Service的生命周期,两种不同的启动方式有不同的生命周期:

Tips:

首先创建自己的Service类,重写其生命周期,并在mainfest.xml中进行注册。

必须注册Service,不然不会调用。简单注册:

补充下Service在manifest中的属性以及作用:

接下来,我们就可以用下面的两个方法来启动和停止服务。

首先在我们的Activity中创建Service连接对象,重写连接和断开的方法。创建自定义的Binder对象,在 onServiceConnected() 中赋值然后可以调用自定义Binder中的方法。使用下方的bind()方法来绑定服务,使用 unBind() 来解绑服务。

这里会用到Service的 onBind() 和 onUnbind() 的生命周期,我们在TestService中重写之。这里要注意的是,使用bindService()方法启动的Service,不会调用 onStartCommand() 的生命周期。此外,创建自定义Binder类和对象。

这样,当我们使用Activity中的bind()方法来绑定服务,会自动启动服务,而我们又重写了 onServiceConnected() 方法并使用myBinder来调用方法。这样我们就可以用它来Activity和Service来进行通信。

特别Tips:

如果先使用 startService() 来开启服务和 bindService() 来绑定服务,当使用 unbindService() 解绑时,Service并不会被销毁。而是使用 stopService() 才能销毁服务。

前台服务和后台服务的区别:

在Service中进行操作,将服务类型以前台的方式运行显示在通知栏。

运行效果:

暂时引用吧,有空再实现一个:

参考资料:

Android中服务service

本文原文连接

Service是Android中的四大组件之一,它的级别和Activity差不多。只不过Service没有页面显示,只能后台运行,可以和其他组件进行交互。

Service的后台运行并不是子线程,是在主线程中进行的,只是它没有界面显示。如果Service进行了耗时操作同样需要开启子线程,否则会跟Activity一样出现ANR问题(application not response–程序没有响应)。

补充说明:

主线程的内容包括UI和后台,只要程序中的UI或者后台其中一个在跑,程序都算是在运行状态。

1,创建一个自己的TestService继承Service

2,必须实现重写其中的onBind方法,可以在里边做各种操作,也可以接收传递过来的Intent的数据。

(在Android Studio中可以直接新建一个Service)

服务的注册是四大组件中最简单的一个,一般只要设置name属性就可以了。

1,startService()启动

(1)启动服务startService:onCerate(),onStart()

(2)停止服务stopService:onDestroy()

此方法启动服务,服务如果未被创建,系统会先调用onCreate()方法,接着调用onStrat()方法。如果调用startService前服务已经被启动,多次调用启动方法,不会多次调用onCreate,但会导致多次调用onStrat。

2,bindService()启动

(1)绑定bindService:onCreate(),onBind()

(2)解除绑定unbindService:onUnbind()

(3)正常停止程序服务的方法是先接触绑定unbindService,在停止服务stopService

绑定后调用stopService方法,这时候是不能停止服务的,如果这时再调用解绑unbindService,程序会先解绑,后停止服务。

用此方法启动服务,在服务未被创建时,会先调用onCreate(),接着调用onBind()方法,这时候调用者和服务绑定在一起,调用者退出,系统会先调用服务的onUnbind(),然后onDestroy()。如果调用bindService之前服务已经被绑定,多次调用bindService并不会导致onCreate()和onBind()方法被多次调用。如果调用者想与正在绑定的服务解除绑定,可以调用unbindService()。

(1),onCerate()服务第一次被创建

(2),onStartComand()服务开始工作

(3),onBind()服务已经绑定

(4),onUnBind()服务解绑

(5),onDestroy()服务已经停止

普通的Service进行耗时操作要创建一个线程去完成,因为service是在主线程运行的,并且这个子线程完成工作要手动停止 。IntentService是继承了Service并处理起步请求的一个类,在IntentService内有一个工作线程,来处理耗时操作,启动IntentService的方式和启动传统的Service是一样,当任务执行完成后,IntentService会自动停止,而不需要我们去控制。

可以启动多次IntentService,每一个耗时操作会以工作队列的方式在IntentService的onHandleIntent回调方法中执行,并且每次只会执行一个工作线程,执行完第一个再执行第二个,以此类推,而且,所有请求都在一个单线程中,不会阻塞主线程,同一时间只处理一个请求。

IntentService优点

1,省去了在Service中开线程的麻烦

2,当操作完成时,不用手动停止Service。IntentService是Service,但是比Service更智能。


当前标题:android服务,android服务的生命周期
网页URL:http://azwzsj.com/article/dsiohpe.html