注册

Android知识点之Service(四)

2、service的生命周期,两种启动模式的区别


(1)、通过startService()方法来启动服务

生命周期:onCreate() -> onStart()或者onStartCommand() -> onDestroy()


onStart()方法是在android 4.1以上版本废弃,采用onStartCommand()方法代替,当服务已经启动时,调用startService()方法不会重复调用onCreate()方法(只有在启动时调用一次),但会调用onStart()或者onStartCommand()方法,这在SystemServer进程的ActiveServices的bringUpServiceLocked方法中有体现:

frameworks/base/services/core/java/com/android/server/am/ActiveServices.java


private String bringUpServiceLocked(ServiceRecord r, int intentFlags, boolean execInFg,
boolean whileRestarting, boolean permissionsReviewRequired)
throws TransactionTooLargeException {
//如果服务已经启动,则进入此判断
if (r.app != null && r.app.thread != null) {
sendServiceArgsLocked(r, execInFg, false);
return null;
}
····
}

private final void sendServiceArgsLocked(ServiceRecord r, boolean execInFg,
boolean oomAdjusted) throws TransactionTooLargeException {
····
//通过跨进程调用应用进程的ActivityThread的ApplicationThread中的scheduleServiceArgs启动服务
//最终调用到应用服务的onStartCommand()方法
r.app.thread.scheduleServiceArgs(r, slice);
····
}

当不使用服务时,调用stopService()来关闭,此时会调用服务的onDestroy()方法


特点:



  • 服务运行与注册者无关联,注册者退出服务不会退出,除非调用stopService()方法

(2)、通过bindService()方法绑定服务

生命周期:onCreate() -> onBind() -> onUnbind() -> onDestroy()


当服务已经绑定,通过unbindService()解绑(没有最终调用spotService()退出服务情况下),此时onUnbind()返回true,再通过bindService()绑定服务,此时不会再调用onBind(),而是调用onRebind(),生命周期如下:


onCreate() -> onBind() -> 调用unbindService()解绑 -> onUnbind(true) -> 调用bindService()绑定 -> onRebind() -> onUnbind() -> onDestroy()


绑定的服务退出,绑定者退出或者调用unbindService()解绑退出


特点:



  • 绑定者可以通过服务内部自定义的Binder实现类来持有服务并且调用服务中的方法
  • 绑定者退出,那么服务也会跟着退出

3、service与activity怎么实现通信


1、通过Intent方式从Activity发送数据给Service

2、使用绑定服务的ServiceConnection通过Binder进行

3、内容提供者、存储的方式

4、广播

5、socket通信

6、全局静态变量方式

7、反射注入的方式(eventBus)


4、IntentService是什么?IntentService的原理?应用场景以及与service的区别


IntentService是一个可以执行耗时操作的服务,内部维护着HandlerThread封装的子线程消息队列来执行耗时任务,在任务执行完时调用stopSelf()方法自动退出服务


原理:

frameworks/base/core/java/android/app/IntentService.java


public abstract class IntentService extends Service {
····
//定义一个Handler对象用于接收与发送消息
private final class ServiceHandler extends Handler {
public ServiceHandler(Looper looper) {
super(looper);
}

@Override
public void handleMessage(Message msg) {
//一个抽象方法,可以被继承者重写,运行在子线程消息队列中
onHandleIntent((Intent)msg.obj);
//任务执行完,自定关闭当前服务
stopSelf(msg.arg1);
}
}
·····

@Override
public void onCreate() {
super.onCreate();
//创建一个HandlerThread对象,HandlerThread是子线程消息循环队列
HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
thread.start();
mServiceLooper = thread.getLooper();
//创建一个子线程的Handler对象,发送的消息运行在子线程消息队列中
mServiceHandler = new ServiceHandler(mServiceLooper);
}

@Override
public void onStart(@android.annotation.Nullable Intent intent, int startId) {
//使用Handler向子线程消息循环队列发送一条消息
Message msg = mServiceHandler.obtainMessage();
msg.arg1 = startId;
msg.obj = intent;
mServiceHandler.sendMessage(msg);
}

@Override
public int onStartCommand(@android.annotation.Nullable Intent intent, int flags, int startId) {
//发送消息运行在子线程消息队列中
onStart(intent, startId);
return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
}

//抽象方法,运行在子线程消息队列中
protected abstract void onHandleIntent(@android.annotation.Nullable Intent intent);
}

应用场景:



  • 后台耗时操作
  • 短暂的耗时服务,如下载资源等

IntentService与service区别:



  • service不能直接执行耗时任务否则会引起ANR,IntentService可以执行耗时任务
  • service启动后需要手动调用stopService()关闭服务,IntentService启动后在执行完任何后会自动关闭服务

5、Service的onStartCommand方法有几种返回值?各代表什么意思?


有四种返回值:




  • START_STICKY:当某个服务被系统杀死时(不是正常结束服务),如果返回值为START_STICKY,则系统会尝试重启该服务,并且调用服务的onStartCommand()方法,但是onStartCommand()方法的Intent参数为Null。




  • START_NOT_STICKY:当某个服务被系统杀死时,如果返回值为START_NOT_STICKY,则系统不会重启该服务。




  • START_REDELIVER_INTENT:当某个服务被系统杀死时,如果返回值为START_REDELIVER_INTENT,则系统会尝试重启该服务,并且调用服务的onStartCommand()方法,并且会创建之前启动服务时传入的Intent,即onStartCommand()方法的Intent参数不为Null。




  • START_STICKY_COMPATIBILITY:这是START_STICKY的兼容版本,不能保证onStartCommand()方法一定会被重新调用。




6、bindService和startService混合使用的生命周期以及怎么关闭?



  • 调用startService()

生命周期 : onCreate() -> onStart()或者onStartCommand() -> onDestroy()

通过调用stopService()方法关闭服务



  • 调用bindService()

生命周期:onCreate() -> onBind() -> onUnbind() -> onDestroy()

通过调用unbindService()方法关闭服务



  • 先调用startService()后再调用bindService()

生命周期:onCreate() -> onStart()或者onStartCommand() -> onBind() -> onUnbind() -> onDestroy()

先调用stopService()再调用unbindService()关闭服务



  • 先调用bindService()后再调用startService()

生命周期:onCreate() -> onBind() -> onStart()或者onStartCommand() -> onUnbind() -> onDestroy()

先调用unbindService()再调用stopService()关闭服务



  • 先调用bindService()后调用unbindService(),最后调用bindService()

生命周期:onCreate() -> onBind() -> 调用unbindService()解绑 -> onUnbind(true) -> 调用bindService()绑定 -> onRebind() -> onUnbind() -> onDestroy()

通过调用unbindService()方法关闭服务


作者:小狼人爱吃萝卜
链接:https://juejin.cn/post/7008699606372450341
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

0 个评论

要回复文章请先登录注册