面试题三:组件之Service系列

目录

Q1:谈一谈Service的生命周期?

Q2:Service的两种启动方式?区别在哪?

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

Q4:Service如何和Activity进行通信?

Q5:用过哪些系统Service?

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

Q7:AlarmManager能实现定时的原理?

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

Q9:是否了解ActivityManagerService,谈谈它发挥什么作用?

Q10:如何保证Service不被杀死?


Service:Service则是在后台运行,默默地为用户提供功能,进行调度和统筹,如果一棵树的地上部分是Activity的话,它庞大的根须就是Service。

相关文章:android编程中service和activity的区别

Q1:谈一谈Service的生命周期?

官方文档提供的Sevice生命周期图如下:

面试题三:组件之Service系列_第1张图片

先来看这几种回调方法含义:
onCreate():服务第一次被创建时调用
onStartComand():服务启动时调用
onBind():服务被绑定时调用
onUnBind():服务被解绑时调用
onDestroy():服务停止时调用

Q2:Service的两种启动方式?区别在哪?

  • startService():开启Service,调用者退出后Service仍然存在。
  • bindService():开启Service,调用者退出后Service也随即退出。

Service生命周期:

  • 只是用startService()启动服务:onCreate() -> onStartCommand() -> onDestory
  • 只是用bindService()绑定服务:onCreate() -> onBind() -> onUnBind() -> onDestory
  • 同时使用startService()启动服务与bindService()绑定服务:onCreate() -> onStartCommnad() -> onBind() -> onUnBind() -> onDestory

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

一个Activty先start一个Service后,再bind时会调用 onBind()方法。

此时调用onUnBind()方法才能回调Service的destory()方法。注意:调用stopService()方法是不行的。

Q4:Service如何和Activity进行通信?

可以通过bindService的方式,先在Activity里实现一个ServiceConnection接口,并将该接口传递给bindService()方法,在ServiceConnection接口的onServiceConnected()方法里执行相关操作。

Q5:用过哪些系统Service?

参考文章:Android系统服务(SystemService)简介

面试题三:组件之Service系列_第2张图片

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

不可以。
Service和activity是运行在当前app所在的main thread(UI主线程)中的,而耗时操作(如:网络请求、拷贝数据、大文件)会阻塞主线程,给用户不好的体验。

如果要做耗时操作的话,有两种方式:
第一种:Thread。无非就是开一个线程,然后一阵混沌操作。当然,你还可以使用 AysncTask 或 HandlerThread 来替代 Thread 创建线程。
第二种:IntentService 。
IntentService是Service的子类,用来处理异步请求。
IntentService在onCreate()方法中通过HandlerThread单独开启一个线程来处理Intent请求对象所对应的任务,这样可以避免事务处理阻塞主线程。
onHandleIntent()函数针对Intent的不同进行不同的事务处理就可以,执行完一个Intent请求对象所对应的工作之后,如果没有新的Intent请求达到,则自动停止Service; 否则ServiceHandler会取得下一个Intent请求
传入该函数来处理其所对应的任务。

Q7:AlarmManager能实现定时的原理?

AlarmManager是Android中常用的一种系统级别的提示服务,在特定的时刻为我们广播一个指定的Intent。简单的说就是我们设定一个时间,然后在该时间到来时,AlarmManager为我们广播一个我们设定的Intent,通常我们使用 PendingIntent,PendingIntent可以理解为Intent的封装包,简单的说就是在Intent上在加个指定的动作。在使用Intent的时候,我们还需要在执行startActivity、startService或sendBroadcast才能使Intent有用。而PendingIntent的话就是将这个动作包含在内了。

定时任务,AlarmManager使用

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

前台服务和普通服务最大的区别是,前者会一直有一个正在运行的图标在系统的状态栏显示,下拉状态栏后可以看到更加详细的信息,非常类似于通知的效果。使用前台服务或者为了防止服务被回收掉,比如听歌,或者由于特殊的需求,比如实时天气状况。

想要实现一个前台服务非常简单,它和之前学过的发送一个通知非常类似,只不过在构建好一个Notification之后,不需要NotificationManager将通知显示出来,而是调用了startForeground()方法。

Q9:是否了解ActivityManagerService,谈谈它发挥什么作用?

ActivityManagerService(AMS)是Android中最核心的服务,主要负责系统中四大组件的启动、切换、调度及应用程序的管理和调度等工作。

AMS所提供的主要功能包括以下几项:

1、统一调度个应用的程序的Activity。应用程序要运行Activity,会首先报告AMS,然后由AMS决定该Activity是否可以启动,如果可以,AMS再通知应用程序指定的Activity。换句话说说运行Activity时各应用程序的内政,AMS并不干预,但是AMS必须知道各应用程序都运行了哪些Activity。

2、内存管理。Android官方声称,Activity退出后,其所在的进程并不会被立即杀死,从而在下次启动该Activity时能够提高启动速度,这些Activity只有当系统内存紧张时,才会被自动杀死,应用程序并不关心这些问题,这些都是在AMS中完成的。

3、进程管理,AMS向外提供了查询系统正在运行的进程信息的API。

Q10:如何保证Service不被杀死?

在onDestory()中发送广播开启自己,当然,从理论上来讲这个方案是可行的,实验一下结果也是可行的。但是有些情况下,发送的广播在消息队列中排的靠后,就有可能服务还没有接收到广播就销毁了(只是猜想)。所以为了能让这个机制完美运行,可以开启两个服务,相互监听,相互启动。服务A监听B的广播来启动B,服务B监听A的广播来启动A。经过实验,这个方案是可行的。

Android Service服务如何不被杀死

你可能感兴趣的:(Andorid:面试)