一.Service生命周期

  • 技术点:Service生命周期
  • Service的生命周期涉及到六大方法

    • onCreate():服务第一次被创建时调用
    • onStartComand():服务启动时调用
    • onBind():服务被绑定时调用
    • onUnBind():服务被解绑时调用
    • onDestroy():服务停止时调用

      二.Service的两种启动方式?区别在哪?

  • 思路:分别解释两种启动模式如何启动和停止Service,并引起生命周期怎样的变化

  • 第一种,其他组件调用Context的 startService() 方法可以启动一个Service,并回调服务中的onStartCommand()。如果该服务之前还没创建,那么回调的顺序是onCreate()->onStartCommand()。服务启动了之后会一直保持运行状态,直到 stopService()stopSelf() 方法被调用,服务停止并回调onDestroy()。另外,无论调用多少次startService()方法,只需调用一次stopService()或stopSelf()方法,服务就会停止了。
  • 第二种,其它组件调用Context的 bindService() 可以绑定一个Service,并回调服务中的onBind()方法。类似地,如果该服务之前还没创建,那么回调的顺序是onCreate()->onBind()。之后,调用方可以获取到onBind()方法里返回的IBinder对象的实例,从而实现和服务进行通信。只要调用方和服务之间的连接没有断开,服务就会一直保持运行状态,直到调用了 unbindService() 方法服务会停止,回调顺序onUnBind()->onDestroy()。

    三.一个Activty先start一个Service后,再bind时会回调什么方法?此时如何做才能回调Service的destory()方法?

  • startService()启动Service之后,再bindService()绑定,此时只会回调onBind()方法;若想回调Service的destory()方法,需要同时调用 stopService()和 unbindService()方法才能让服务销毁掉。

    四.Service如何和Activity进行通信?

  • 思路:简单介绍Service如何和Activity双向通信的流程

  • 通过bindService()可以实现Activity调用Service中的方法;
  • 通过广播实现Service向Activity发送消息

    五.用过哪些系统Service?

    5494434-2588ec70045e4ab2.webp

    六.是否能在Service进行耗时操作?如果非要可以怎么做?

  • 参考回答:Service默认并不会运行在子线程中,也不运行在一个独立的进程中,它同样执行在主线程中(UI线程)。换句话说,不要在Service里执行耗时操作,除非手动打开一个子线程,否则有可能出现主线程被阻塞(ANR)的情况。

    七.前台服务是什么?和普通服务的不同?如何去开启一个前台服务?

  • 和一般运行在后台的服务不同,前台服务的服务状态可以被用户一眼看到。

  • 它和普通服务最大的区别是

    • 前台服务会一直有一个正在运行的图标在系统的状态栏显示,下拉状态栏后可以看到更加详细的信息,非常类似于通知的效果,且当系统内存不足服务被杀死时,通知会被移除。实现一个前台服务也非常简单,和发送一个通知非常类似,只不过在构建好一个Notification之后,不需要NotificationManager将通知显示出来,而是调用了 startForeground() 方法。

      八.如何保证Service不被杀死?

  • 在Service的onStartCommand()中设置flages值为START_STICKY,使得Service被杀死后尝试再次启动Service;

  • 提升Service优先级,比如设置为一个前台服务;
  • 在Activity的onDestroy()通过发送广播,并在广播接收器的onReceive()中启动Service;

    九.是否了解ActivityManagerService,谈谈它发挥什么作用?

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

  • 引申: