Android学习计划第二周

Android学习计划# #第2周# 问题:

清晰地理解Service。
1、Service的start和bind状态有什么区别?
2、同一个Service,先startService,然后再bindService,如何把它停止掉?
3、你有注意到Service的onStartCommand方法的返回值吗?不同返回值有什么区别?
4、Service的生命周期方法onCreate、onStart、onBind等运行在哪个线程?

直接回答问题
1⃣️ bind和start二种方式启动服务的区别
start 启动一个服务会回掉onCreate() 和onStartCommand()方法,onStartCommand()有个返回值,系统提供了四种返回值,

它们的含义分别是:
1):START_STICKY:如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。随后系统会尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null。
2):START_NOT_STICKY:“非粘性的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务
3):START_REDELIVER_INTENT:重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。
4):START_STICKY_COMPATIBILITY:START_STICKY的兼容版本,但不保证服务被kill后一定能重启。

注意我们通过startService()去启动一个服务后,再次调用startService()启动这个服务时,onCreat()方法时不会被调用的,被调用的只有onStartCommand()方法, 原因很简单,我们第一次启动服务时系统就会为我们创建这个服务对象,之后启动新请求时运行服务就好,不应该再重复创建服务对象了,所以我们通过startService()启动服务时,相关处理逻辑代码请写在onStartCommand()中。

记住start启动一个服务后服务是不会自己去停止的,需要我们在onStartCommand()中处理结束我们的逻辑后手动去调用stopSelf()方法结束自己,但是这么做可能会存在一个问题,什么问题呢?
假设二个界面分别去请求这个服务,好第一个请求处理完全部逻辑后,此时第二个界面调用startService开启了一个新请求,那么此时第一个界面逻辑处理完毕后调用stopSelf()方法就会结束掉这个服务,第二个界面的请求逻辑将不再执行,那么怎么办呢?系统为我们提供一个api 我们可以调用stopSelf(int id)这个重载方法结束服务,还是上面假设情况,当我们第一个界面start启动一个服务请求时,onStartCommand()中传递给我们一个startID,ok当我们所有操作逻辑全部结束,第二个界面star开启了一个新请求,此时onStartCommand()中传递一个不同于第一个界面的新的startID,那么当我们第一个界面调用stopSelf(int id)去通过旧id结束这个服务时,系统判断跟现在新的id不匹配所以就不会结束这个服务。

bindService()这个方法一般是跨进程通信时使用的,bindService时我们会传入一个ServiceConnection对象,这个对象有个二个回调,在我们绑定服务成功回调中,会传递给我们一个Ibinder对象,这个对象就是我们定义的AIDL接口在Service中的具体实现逻辑。
bind成功启动服务后 会调用onCreate() ,onBind()方法,我们需要返回一个具体IBinder实现类,如果是通过AIDL方式我们就返回ADIL生成的java类中通过stub()得到的IBinder对象,并实现里面我们所有定义的接口方法就行了。

我们通过bind启动服务后跟start不一样的是我们停止服务是通过调用unbindService()方法关闭跟服务的连接,当连接断开后服务就停止运行了,注意当多个客户端绑定这个服务时,需要所有客户端全部调用unbindService()解绑后服务才会停止,否则哪怕还有一个客户端绑定服务也会照样运行。

2⃣️
同一个Service,先startService,然后再bindService,想停止掉它的话也必须按照顺序先unbindService()解绑后再调用stopService()去停止这个服务,如果我们直接调用stopService()去停止服务,日志会打印出我们还没有解绑这个服务必须解绑后才可以停止。

3⃣️
onStartCommand()方法的返回值不同含义在回答1⃣️中已经指出

4⃣️
这个问题我只是知道都是运行在main主线程的,由于还没查阅过这部分源码暂时回答不出来~日后补上

你可能感兴趣的:(Android学习计划第二周)