美文网首页
Android学习计划第二周

Android学习计划第二周

作者: boboyuwu | 来源:发表于2017-11-20 21:08 被阅读21次

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学习计划# #第二十五周# 话题:动态权限 描述下Android的动态权限:这些权限的分类是什么?...

  • Android学习计划第二周

    Android学习计划# #第2周# 问题: 清晰地理解Service。1、Service的start和bind状...

  • getWidth与getMeasuredWidth的区别,如何在

    Android学习计划第五周 问题一:getWidth()与getMeasuredWidth()的区别 从源码看区...

  • 早睡早起周总结

    12月第二周周总结 【工作】 1.参加公司启动大会,为过年做准备 2.指定半月计划,周计划,日计划 【学习】 1....

  • 第二周学习计划

    本周将继续学习SQL必知必会这本书,从第二课开始,尽量多几章。

  • 第二周学习计划

    星期一(2.8) ❶科目一《写作1》 ❷科目二《学前教育原理1》 星期二(2.9) ❶科目一《写作2》|文化素养(...

  • 8月第二周,我满意了吗

    8月第二周,学习教练的第三周,全职妈妈的第二周。 按照原计划,完成率其实很不理想。 这一周,教练学习有点不在状态,...

  • Activity的启动模式

    Android学习计划# #第三周# 话题: 理解Activity的启动模式。1、Activity的启动模式有哪几...

  • PHP第二周课程导学

    首先,各位同学利用周末时间赶快调试好自己电脑的编程环境第二周学习计划:我们将会在第二周主要学习2.7流程控制语句(...

  • #Android学习计划第二周 清晰地理解Service

    1.Service的start和bind状态有什么区别? 调用startService,service的完整生命周...

网友评论

      本文标题: Android学习计划第二周

      本文链接:https://www.haomeiwen.com/subject/dropvxtx.html