<1>Service生命周期
onCreat():服务第一次被创建时调用
onStartCommand():服务启动时调用
onBind():服务被绑定时调用
onUnBind():服务被解绑时调用
onDestroy():服务停止时调用
<2>Service的两种启动方式?区别在哪?
第一种,其他组件调用Context的startService()方法可以启动一个Service,并回调服务中的onStartCommand()。如果该服务之前还没有创建,那么回调的顺序是:onCreate()-->onStartCommand()。服务启动了之后会一直保持运行状态,直到stopService() 或 stopSelf()方法被调用,服务停止并回调onDestroy()。另外,无论调用多少次startService()方法,只需调用一次stopService()或stopSelf()方法,服务就会停止了。
第二种,其他组件调用Context的bindService()可以绑定一个Service,并回调服务中的onBind()方法。类似地,如果该服务之前还没有创建,那么回调顺序是onCreate()-->onBind()。之后,调用方可以获取到onBind()方法里返回的IBinder对象实例,从而实现和服务进行通信。只要调用方和服务之间的连接没有断开,服务就会一直保持运行状态直到调用了unbindService()方法服务就会停止,回调顺序onUnBind()-->onDestroy()。
<3>一个Activty先start一个Service后,再bind时会回调什么方法?此时如何做才能回调Service的destory()方法?
startService()启动Service之后,再bindService()绑定,此时只会回调onBind()方法;若想回调Service的destroy()方法,需要同时调用stopService()和unbindService()方法才能让服务销毁掉。
<4>Service如何和Activity进行通信?
通过bindService()可以实现Activity调用Service中的方法;
通过广播实现Service向Activity发送消息;
<5>用过哪些系统Service?
WINDOW_SERVICE
LAYOUT_INFLATER_SERVICE
ACTIVITY_SERVICE
POWER_SERVICE
ALARM_SERVICE
NOTIFICATION_SERVICE
KEYGUARD_SERVICE
<6>是否能在Service进行耗时操作?如果非要可以怎么做?
Service默认并不会运行在子线程中,也不运行在一个独立的进程中,它同样执行在主线程中。所以不要在Service里执行耗时操作,除非手动打开一个子线程,否则有可能出现ANR的情况。
<7>AlarmManager能实现定时的原理?
通过调用AlarmManager的set()方法就可以设置一个定时任务,并提供三个参数(工作类型,定时任务触发的时间PendingIntent对象)。其中第三个PendingIntent对象是关键,一般会调用它的getBroadcast()方法来获取一个能够执行广播的PendingIntent。这样当定时任务呗触发的时候,广播接收器的onReceiver()方法就可以得到执行。即通过服务和广播的循环触发实现定时任务。
<8>前台服务是什么?和普通服务的不同?如何去开启一个前台服务?
和一般运行在后台的服务不同,前台服务的服务状态可以被用户一眼看到。它和普通服务最大的区别是,前者会一直有一个正在运行的图标在系统单状态栏显示,下拉状态栏可以看到更加详细的信息,非常类似于通知的效果,且当系统内存不足服务被杀死时,通知会被移除。实现一个前台服务也非常简单,和发送一个通知非常类似,只不过在构建一个Notification之后,不需要NotificationManager将通知显示出来,而是调用了startForeground()方法。
<9>是否了解ActivityManagerService,谈谈它发挥什么作用?
ActivityManagerService是Android中最核心的服务,主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,其职责与操作系统中的进程管理和调度模块类似。
<10>如何保证Service不被杀死?
在Service的onStartCommand()中设置flages值为START_STICKY,使得Service被杀死后尝试再次启动Service
提升Service优先级,比如设置为一个前台服务
在Activity的onDestroy()通过发送广播,并在广播接收器的onReceiver()中启动Service
<11>什么是IntentService?有何优点?
IntentService是Service的子类,比普通的Service增加了额外的功能。
先看Service本身存在两个问题:
1.Service不会专门启动一条单独的进程,Service与它所在应用位于同一个进程中;
2.Service也不是一条新线程,因此不应该在Service中直接处理耗时的任务;
IntentService优点:
1.会创建独立的工作线程来处理所有的intent请求;
2.会创建独立的工作线程来处理onHandleIntent()方法实现的代码,无需处理多线程问题;
3.所有请求处理完成后,IntentService会自动停止,无需调用stopSelf()方法停止Service;
4.为Service的onBind()提供默认实现,返回null;
5.为Service的onStartCommand()提供默认实现,将请求Intent添加到队列中;
IntentService使用:
让Service类继承IntentService,重写onStartCommand()和onHandleIntent()实现