Activity与Service的一些总结

Service 生命周期探讨


 启动Service有两种方式,一种是用 startService,另一种是 bindService ,这里不讨论生命周期流程,而是讨论两种启动方式单独使用和混合使用时 Service 状态的变化。我们可以在这些方法中加上Log来验证生命周期,经过我的尝试,单独使用 startService stopService,流程是 onCreate--onStartCommand--onDestroy. 单独使用 bindService ,流程是 onCreate--onBind--onUnbind--onDestroy. 倘若先用 StartService 再用 bindService ,onCreate方法只运行一次,这时无论使用 unbindService 还是 stopService ,服务都不会销毁,要同时满足两个条件才能销毁,更多的信息可以运行我文章结尾的Demo验证

Activity与Service的一些总结_第1张图片

startService 和 bindService 一些区别总结


StartService方法只要一个 Intent 来启动即可,启动服务后服务将一直在后台运行,即使 Activity 销毁依然存在.
bindService方法主要参数有两个,Intent ,ServiceConnection,其中ServiceConnection作用是 Activity 和 Service 建立连接时通信使用 ,当我们的Activity和Service 绑定时,系统将会调用 ServiceConnection 的 onServiceConnected 方法,我们可以从该方法的 IBinder 参数中获取Service 的相关数据,这个IBinder 就是 onBind()方法 return 的,值得注意的是,假如没有先 startService,bindService后绑定的最后一个 Activity 销毁时,service也将销毁,且bindService后的Service 在系统 Running 任务管理器下是看不见的。但先startService,接着 bindService 时,系统 Running 任务管理器显示该服务,Service 解绑后,onDestroy并不会得到运行

Activity与Service的一些总结_第2张图片

使用 Service 的一些注意事项


  1. Service 时虽然用户不可见,但是和 Activity 都在主线程,在做一些耗时任务时应该启动 线程,不然会引起界面停止,ANR错误
  2. 虽然 Activity 销毁时,绑定的 Service 会自动销毁,但是会显示有异常,查阅后要在 Activity 的 onDestroy方法中 unbindService 才解决,当然这里,要加上判断,不然没有绑定就退出也会报异常
Activity与Service的一些总结_第3张图片
  1. 暂时没想到,有了再补充

Service 更新 UI 的一些总结


Activity与Service的一些总结_第4张图片

 在我的 Demo 中,Service 里面模拟下载任务,利用 观察者模式,下载进度更新时主动提醒 Activity 处理,这里有一个问题,假如在 回调方法 中直接更新UI,因为 线程 的原因会报错,这里就用到 Handler 来解决这个问题

Activity与Service的一些总结_第5张图片

 还遇到了另一个问题,假如我们 bindService 后开始后台的下载任务,任务还未完成就销毁了Service,这时 Thread 里面的任务就会报错,我们必须在 Service onDestroy时停止 Thread 里面的任务,这时候 内部类的好处就显示了,由于我们的 downTask 类是在 Service 里面的,可以 service 的 onDestroy 方法中增加布尔值来标记销毁状态,Thread里面的任务根据该布尔值的变化决定是否退出任务,代码如下

Activity与Service的一些总结_第6张图片
Service销毁时
Activity与Service的一些总结_第7张图片

Demo的Github地址: https://github.com/RunHuaOil/AndroidPractice/tree/master/ServiceTest

你可能感兴趣的:(Activity与Service的一些总结)