Android面试系列之【Service你要的都在这里】

2020-03-02  本文已影响0人  西瓜家族

1、启动方式和区别

Service不同的启动方式有不同的生命周期与回调方法, startService() 启动Service会回调 onStartCommand()bindService() 绑定Service会回调 onBind()

无论哪种方式启动Service,任何组件都可以使用Service(甚至其他的应用程序的组件),并通过Intent传递参数。你可以在 AndroidMenifest.xml 中将 android:exported="false" Service配置成私有的,不允许其他应用访问。这样配置不允许其他应用程序启动本应用的Service,即便是显示的Intent也不行。

2、生命周期

找了一个神图

这个基本上初级程序员都会学习到的,就不述说了。来说说重点吧!

  • 完整生命周期:从onCreate()onDestroy() 返回。和Activity类似,一般在onCreate()方法中做一些初始化的工作,在onDestroy()方法中做一些资源释放的工作。如若Service在后台播放一个音乐,就需要在 onCreate() 方法中开启一个线程启动音乐,并在 onDestroy() 中结束线程。
  • 活动生命周期:从 onStartCommand()onBind() 回调开始,由相应的 startService()bindService() 调用。start 方式的活动生命周期结束就意味着完整证明周期的结束,而 bind 方式,当 onUnbind() 返回后,Service 的活动生命周期结束。

注意

  • 无论是 startService() 还是 bindService() 启动Service,onCreate()onDestroy() 均会被调用且只会被执行一次。 onStartCommand() 可以执行多次,也就是说一旦Service创建过了,而又没有被销毁的话, 不管是再次调用bindService还是startService都不会再走 onCreate()onBind()也只会执行一次,多次调用startService会多次执行 onStartCommand()
  • Service中的 onBind()方法返回null的话,无法回调ServiceConnection

3、AndroidManifest里Service的常见属性说明

属性 说明 备注
android:name 类名
android:enabled 系统默认启动 不设置则默认为false默认为true,被系统启动。适用于四大组件
android:label 名字 若不设置,默认为Service类名
android:icon 图标
android:permission 申请此Service的权限 有提供了该权限的应用才能控制或连接此服务
android:process 是否在另一个进程中运行(远程服务) 不设置默认为本地服务,remote则设置成远程服务
android:exported 是否能够被其他应用程序所控制或连接 不设置默认为false

4、如何提高service的优先级

1、在AndroidManifest.xml文件中对于intent-filter可以通过android:priority = “1000”这个属性设置最高优先级,1000是最高值,如果数字越小则优先级越低,同时实用于广播。

2、在onStartCommand里面调用 startForeground()方法把Service提升为前台进程级别,然后再onDestroy里面要记得调用stopForeground ()方法。

3、onStartCommand方法,手动返回START_STICKY。

4、 在onDestroy方法里发广播重启service。
service +broadcast 方式,就是当service走ondestory的时候,发送一个自定义的广播,当收到广播的时候,重新启动service。(第三方应用或是在setting里-应用-强制停止时,APP进程就直接被干掉了,onDestroy方法都进不来,所以无法保证会执行)

5、监听系统广播判断Service状态。
通过系统的一些广播,比如:手机重启、界面唤醒、应用状态改变等等监听并捕获到,然后判断我们的Service是否还存活。

6、Application加上Persistent属性。

5、Service的onStartCommand()方法有几种返回值?

6、Service的onRebind(Intent)方法什么时候会执行?

如果在 onUnbind() 返回true的情况下会执行,否则不执行。
调用过程:
1、启动服务 onCreate()onStartCommand() 方法被回调;
2、绑定服务 onBind() 方法被回调;
3、 解绑服务(可以调用 unBindService()方法,或退出绑定Service的Activity组件) onUnbind() 方法被回调;
4,重新绑定服务 (eg:再次进入该Activity,调用bindService方法绑定服务) onRebind(Intent)方法被回调。

7、你一般在什么情况下会使用Service?

8、Service的分类

Service的分类.png
上一篇下一篇

猜你喜欢

热点阅读