Android面试四大组件之服务Service

Posted Rose J

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android面试四大组件之服务Service相关的知识,希望对你有一定的参考价值。

1.service的启动方式

第一种

startService(Intent)

Intent intent=new Intent(MainActivity.this,MyService.class);

startService(intent);

特点:

  • 一旦服务开启跟开启者就没有任何关系;
  • 开启者退出之后,服务还是可以在后台长期运行的。前提是没有调用 stopService(Intent);
  • 开启者不能调用服务里面的方法

第二种

bindService(Intent , ServiceConnection , flag)

Intent intent=new Intent(MainActivity.this,MyService.class);

bindService(intent,new MyServiceConnection(),BIND_AUTO_CREATE);

特点:

  • bindService的方式开启服务,绑定服务,调用者挂了,服务也会跟着挂掉。
  • 绑定者可以调用服务里面的方法。

两者区别

1.startService启动Service ,Service有独立的生命周期,不依赖该组件
2.多次调用startService方法,会重复调用onStartCommand方法;
3.必须通过stopService或者stopSelf来停止服务(IntentService会自动调用stopSelf方法)

1.bindService启动Service,多次调用此方法,只会调用一次onBind方法;

2.bindService,Service 依赖于此组件,该组件销毁后,Service也会随之销毁。

3.调用n次bindService,必须调用n次unBindService方法;

2.service的生命周期

Service的生命周期

第一种

启动服务 生命周期方法流程:onCreate — > onStartCommand

关闭服务:stopService(Intent)

关闭服务 生命周期方法流程 :onDestory

第二种

启动服务 生命周期方法流程:onCreate-- >onBind

关闭服务: stopService(Intent)

关闭服务 生命周期方法流程 :onUnBind ----> onDestory

3.service怎么使用

第一种

1.定义一个类,并且继承service

2.在 androidManifest.xml 文件中配置注册 Service

3.通过Context的 startService(Intent) 方法来启动 Service

4.不使用该服务时,调用 stopService(Intent) 方法停止此 Service

第二种

1.定义一个类,并继承 Service
2.在 AndroidManifest.xml 中配置此 Service
3.使用 Context 的 bindService(Intent, ServiceConnection, int) 方法来启动此 Service
4.不使用该服务时,调用 unbindService(ServiceConnection) 方法停止此 Service

4.service怎么进行耗时操作

service运行在主线程,所以不能进行耗时操作

方法一:service中开子线程

方法二: 使用IntentService

IntentService是继承Service的抽象类,在IntentService中有一个工作线程来处理耗时操作。

IntentService是一个基于Service的一个类,用来处理异步的请求。你可以通过startService(Intent)来提交请求,
该Service会在需要的时候创建,当完成所有的任务以后自己关闭,而不需要我们去手动控制

原理: IntentService 的 onCreate方法 中利用 HandlerThread 创建了一个循环的工作线程,

然后将工作线程中的Looper对象作为参数来创建ServiceHandler消息执行者。

使用:

public class TestService extends IntentService {

public TestService() {
    super("TestService");
}

@Override
protected void onHandleIntent(@Nullable Intent intent) {
    //执行耗时操作
}
}

5.service怎么保活

1. onStartCommand方法,返回START_STICKY

onStartCommand方法,返回START_STICKY 在运行onStartCommand后service进程被杀死后,那将保留在开始状态,但不会保留那些传入的intent。不久后service就会再次尝试重新创建,因为保留在开始状态,在创建 service后将保证调用onstartCommand。如果没有传递任何开始命令给service,那获取到的Intent为null。手动返回START_STICKY,亲测当service因内存不足被kill,当内存又有的时候,service又被重新创建,但是不能保证任何情况下都被重建,比如进程被干掉了….

2. 提升Service优先级

在AndroidManifest.xml文件中对于intent-filter可以通过android:priority = “1000”这个属性设置最高优先级,1000是最高值,如果数字越小则优先级越低,同时适用于广播。

3.提升Service进程优先级

Android中将进程分成6个等级,由高到低分别是:前台进程、可视进程、次要服务进程、后台进程、内容供应节点以及空进程。当系统进程空间紧张时,会按照优先级自动进行进程回收。可以使用startForeground()将服务设置为前台进程。

4.在onDestory中重启Service

直接在onDestroy()里startService或service +broadcast 方式,就是当service走ondestory的时候,发送一个自定义的广播,当收到广播的时候,重新启动service。

5.监听系统广播判断Service状态

通过系统的一些广播,比如:手机重启、界面唤醒、应用状态改变等等监听并捕获到,然后判断我们的Service是否还存活,但要记得加权限

6.将APK安装到/system/app,变身系统级应用

这种方式适合调试来用,并不算是一种解决办法,不推荐使用,因为你的APP是给用户使用的。

以上是关于Android面试四大组件之服务Service的主要内容,如果未能解决你的问题,请参考以下文章

Android四大组件之Service

android 四大组件之Service 粘性与非粘性

Android四大组件之service

Android安卓四大组件之Service

Android四大组件之服务的两种启动方式详解

Android四大组件之Service精通