Service

作者: InFatuated | 来源:发表于2019-06-24 17:47 被阅读2次

1、谈一谈Service的生命周期?

onCreate():如果service没被创建,调用startService()后会执行onCreate回调,但如果service已经被创建了,那就不会再执行onCreate的回调了。也就是说Service只有在第一次创建时才会经历onCreate生命周期,多次重复执行startService并不会重复调用onCreate。所以此方法适用于一些初始化的工作。

onStartCommand():服务启动时调用,此方法适合完成一些数据加载方面的工作,比如在此创建一个线程,播放音乐或下载数据等。

onBind():服务被绑定时调用。

onUnBind():服务被解绑时调用。

onDestory():服务被停止时调用。

2、Service的两种启动方式?区别在哪?

startService():通过这种方法调用startService(),onCreate()只会被调用一次,多次调用startService会多次执行onStartComman()d和onStart()方法。如果外部没用调用stopService()或stopSelf()方法,service会一直运行

bindService():如果该服务还没有被创建,系统的回调顺序为onCreate()→onBind()。如果调用bindService()方法前,service已经被绑定多次调用bindService()不会多次将创建服务及绑定。如果调用之者需要解绑,则可调用unbindService()回调顺序为:unbind()→onDestory();


3、如何保证Service不被杀死 ?

onStartCommand()方式中,返回START_STICKY或者START_REDELIVER_INTENT

START_STICKY:如果返回START_STICKY,表示Service的运行进程被强行杀死后,Android系统依然将该Service设置为started(即运行状态),但不再保存onStartCommand方法传入的intent对象。

START_NOT_STICKY:表示Service被Android系统杀死后,不会再重新创建该Service。

START_REDELIVER_INTENT:与START_STICKY方式类似,区别在于它会保留最后一次传入onStartCommand中的intent对象,在Severice再次创建时,会将其入到重新创建的Service中的onStartCommand方法中。

提高Service的优先级,在AndroidManifest.xml文件中对于intent-Filter可以通过anroid:priorty="1000"设置最高优先级,1000位最高级,该属性同样适用于广播。

在onDestory()中重启Service,当Service走到onDestory时,发送一个自定义广播,当广播收到后,重启该Service。

提高Service的进程优先级:进程优先级由高到底:前台进程→可视进程→服务进程→后台进程→空进程 可以使用startForegound,将Service放置在前台这样可以减小其被杀死的可能性。

系统广播监听Service状态

将APP装入System/app/ 中将其变为系统应用。

注意:以上机制都不能百分百保证Service不被杀死,除非做到系统白名单,与系统同生共死


4、能否在Service开启耗时操作 ? 怎么做 ?

Service默认不会在子线程中进行,也不运行在一个独立的进程中,同样是执行在主线程中(UI线程)。换句话说,不要在service中执行耗时操作,除非你打开一个子线程,否则会出现ANR(线程阻塞)的情况

5、用过哪些系统Service ?

ServiceExample


6、了解ActivityManagerService吗?发挥什么作用

ActivityManagerService是Android中最核心的服务,主要负责系统中的四大组件的启动、切换、调度、及应用进程的管理,其职责类似于操作系统中的任务管理器与调度模块。

相关文章

网友评论

    本文标题:Service

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