Android面试(Service部分)

Service是什么?

Service作为Android四大组件之一,Service是可以在后台执行长时间任务而没有用户界面的应用组件。

 

ServiceThread的区别

Thread是程序运行的最小单元——线程。

Service是安卓的一种机制,运行在主线程,因此在Service中进行耗时操作也需要开启新的线程。

那为什么还要Service不在Activity中直接操作Thread呢?

因为activity很难对Thread进行管理,当activity销毁了,之后的activity就没办法获取到之前创建的Thread

 

StartService步骤

1、定义一个类继承于Service

2、Manifest.xml文件中配置该Service

3、使用ContextstartService(Intent)方法启动该Service

4、不再使用时使用stopService(Intent)方法停止该服务

 

BindService步骤

1、定义一个类继承Service,创建一个继承与Binder的实例对象,并提供公共方法供客户端调用。

2、实现onBind()方法,返回Binder实例

3、Manifest.xml文件中配置该Service

4、在客户端中,实现ServiceConnection实例,从onServiceConnected()回调方法接收Binder,并使用bindService绑定服务。注:onServiceDiscounnection方法是在服务崩溃或者服务杀死导致的连接中断时调用

 

Service的生命周期

Android面试(Service部分)


startServicebindService回调的生命周期是不一样的。

startService中:

首先会回调onCreate,再调用onStartCommand,最后在setopSelf或者Activity中调用stopService(Intent)方法时,会调用onDestroy方法。


onCreate:首次创建服务时,系统会调用此方法来执行一次性设置程序,该方法在onBindonStartCommand方法之前,如果服务已经在运行则不会再调用词方法,总的来说,该方法只会在Service创建时,调用一次。


onStartCommand:每次通过startService(Intent)方法启动Service时都会调用。其中我们可以注意onStartCommand是有返回值的,其中返回值包括:START_STICKYSTART_NOT_STICKYSTART_REDELIVER_INTENTSTART_STICKY_COMPATIBILITY

START_STICKY:如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。随后系统会尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null

START_NOT_STICKY:“非粘性的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务。

START_REDELIVER_INTENT:重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。

START_STICKY_COMPATIBILITYSTART_STICKY的兼容版本,但不保证服务被kill后一定能重启。


OnDestroy:在Service销毁时调用,可在此回收一些资源。

 

bindService中:

首先会调用onCreate,然后调用onBind方法,然后在ActivityService解绑时调用Unbind方法,最后在所有ActivityService解绑后,该Service会销毁,并调用onDestroy方法。

onBind:绑定服务才会调用,但注意即使我们用startService也要实现该方法。