如何让android的service一直在后台运行
发布网友
发布时间:2022-04-26 19:08
我来回答
共1个回答
热心网友
时间:2022-06-28 19:26
Started Service的生命周期:
onCreate():创建服务
onStartCommand():服务开始运行(在2.0以前版本中,使用onStart()回调方法)
onDestroy() :服务被停止
【详细说明:】
在程序中调用:context.startService() 会触发执行Service生命周期中的onCreate()、onStartCommand()回调方法,此时服务就开始正式运行;
如果Service还没有运行,则android先调用onCreate()然后调用onStartCommand();如果Service已经运行,则只调用onStartCommand(),所以一个Service的onStartCommand方法可能会重复调用多次;
如果在程序中调用:context.stopService()会触发执行Service生命周期中的onDestroy()回调方法,会让服务停止;
stopService()的时候直接onDestroy,如果是调用者自己直接退出而没有调用stopService()的话,Service会一直在后台运行。该Service的调用者再启动该Service后可以通过stopService关闭Service;stopSelf()
所以StartService的生命周期为:onCreate --> onStartCommand(可多次调用) --> onDestroy。
Service运行在后台,它是不可见的、无界面的程序 Service运行在主线程中;最好在Service中启动新线程来运行耗时的任务
为什么不使用后台线程而使用Service?
· 1、Service可以放在独立的进程中,所以更安全;
· 2、使用Service可以依赖现有的binder机制,不需要在应用层面上处理线程同步的繁杂工作;
· 3、系统可以重新启动异常死去的Service。
服务的分类
1本地服务 2远程服务
启动服务的方法
1)、 Context.startService()
调用者与服务之间没有关联,即使调用者退出,服务仍可运行
2)、 Context.bindService()
调用者与服务绑定在一起,调用者一旦退出,服务也就终止
a 本地服务的分类:
StartedService 被启动服务
被启动的服务是由其它组件调用startService()方法而启动的,onStartCommand()被回调,除非调用stopSelf()或stopService()来停止该服务。否则该服务还可以在后台无限期运行
BoundService 绑定服务
绑定服务是允许其它应用程序绑定并且与之交互的Service的实现类。为了提供绑定,必须实现onBind()回调方法。该方法返回IBinder对象,它定义了服务类与Activity交互的程序接口。
根据onStartCommand()的返回值还划分为:粘性服务和非粘性服务
· START_STICKY(常量值:1):sticky的意思是“粘性的”。使用这个返回值时,我们启动的服务跟应用程序"粘"在一起,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务。当再次启动服务时,传入的第一个参数将为null;
· START_NOT_STICKY(常量值:2):“非粘性的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务。
· START_REDELIVER_INTENT(常量值:3):重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。
b远程服务
远程服务是吧数据暴露出来 由其他应用程序调用
1、Started Service的生命周期:
· onCreate():创建服务
· onStartCommand():服务开始运行(在2.0以前版本中,使用onStart()回调方法)
· onDestroy() :服务被停止
调用startedservice会调用服务里的onstartedcommand方法 如果第一次调用会调用oncreate方法 。
调用stopservice会调用服务里的ondestroy()
2、Bound Service的生命周期:
· onCreate():创建服务
· onBind():绑定服务,服务开始运行
· onUnbind():取消绑定
· onDestroy() :服务被停止
· 在程序中调用:context.bindService()会触发执行Service生命周期中的onCreate()、onBind()回调方法,此时服务开始运行;
· onBind将返回给客户端一个IBind接口实例,IBind允许客户端回调服务的方法,比如得到Service运行的状态或其他操作。此后调用者(Context,例如Activity)会和Service绑定在一起;
· 如果调用Service的调用者Context退出了,那么会依次调用Service生命周期中的onUnbind()、onDestroy()回调方法,会让服务停止;
· 所以BindService的生命周期为:onCreate --> onBind(只一次,不可多次绑定) --> onUnbind --> onDestory。
· Service是不能自己启动
IntentService和Service
· 生成一个默认的且与主线程互相独立的工作者线程来执行所有传送至 onStartCommand() 方法的Intetnt
· 生成一个工作队列来传送Intent对象给你的onHandleIntent()方法,同一时刻只传送一个Intent对象,这样一来,你就不必担心多线程的问题。
· 在所有的请求(Intent)都被执行完以后会自动停止服务,所以,你不需要自己去调用stopSelf()方法来停止该服务
· 提供了一个onBind()方法的默认实现,它返回null
· 提供了一个onStartCommand()方法的默认实现,它将Intent先传送至工作队列,然后从工作队列中每次取出一个传送至onHandleIntent()方法,在该方法中对Intent对相应的处理
IntentService使用队列的方式将请求的Intent加入队列,然后开启一个worker thread(线程)来处理队列中的Intent,对于异步的startService请求,IntentService会处理完成一个之后再处理第二个,每一个请求都会在一个单独的worker thread中处理,不会阻塞应用程序的主线程。
这里就给我们提供了一个思路,如果有耗时的操作可以在Service里面开启新线程,也可以使用IntentService来处理耗时操作。 但你若是想在Service中让多个线程并发的话,就得使用第一种方法,在Service内部起多个线程,但是这样的话,你可要处理好线程的同步。