android四大基础组件--ServiceService

生命周期详解


1、Service的生命周期:


I> 在非绑定Service情况下,只有oncreate(),onStartCommand(),onDestory()方法情况下:

    

  操作方法对应生命周期一:

   a、【执行startService(Intent)

   执行生命周期方法:oncreate()--->onStartCommand();

   b、【执行stopService(Intent)】 

   执行生命周期方法:onDestory();


  操作方法对应生命周期二: 

   a、【执行startService(Intnet)

   执行生命周期方法:oncreate()--->onStartCommand();

   b、【执行返回键】--->【执行startService(Intnet)

   执行生命周期方法:onStartCommand();

   c、【执行stopService(Intent)

   执行生命周期方法:onDestory();

   d、【执行startService(Intnet)

   执行生命周期方法:oncreate()--->onStartCommand();

   e、【执行stopService(Intent)】--->【执行返回键】--->【执行startService(Intnet)】    执行生命周期方法:oncreate()--->onStartCommand()

 

  总结:

  只有当service被首次创建的时候才会执行oncreate()方法,同个service被多次启动的时候就不会调用oncreate()方法,但是每次的启动都会调用onstartCommand()方法;


II> 在绑定Service情况下,只有onCreate(),onBind(Intent intent),onUnbind(Intent intent),onDestroy()方法情况下:


  操作方法对应生命周期:

  a、【执行bindService(intent,conn, Service.BIND_AUTO_CREATE)

  执行生命周期方法:oncreate()--->onBind()---> ServiceConnection类的onServiceConnected()(作用:activity与service建立连接的方法);

  b、【执行unbindService(conn)

  执行生命周期方法:onUnbind()--->onDestory();




III>绑定service和非绑定service混合使用执行的生命周期


  操作方法:

  a、【执行startService

  执行生命周期方法:onCreate()-->onStartCommand();

  b、【执行bindService

  执行生命周期方法:onBind()--->onServiceConnected();

  c、【执行onUnbindService

  执行生命周期方法:onUnbind();

  d、【执行bindService

  执行生命周期方法:onServiceConnected()-->onRebind();

  e、【执行onUnbindService

  执行生命周期方法:onUnbind;

  f、【执行stopService

  执行生命周期方法:onDestory()



调用Service如下:


执行的打印结果如下:



总结:

1、当service执行startService操作以后,执行bindService,在service被绑定以后没有解绑的情况下,去执行stopService,此时不会触发Service的onDestory方法,但是解除绑定以后,继续执行stopService将触发onDestory方法。

2、ServiceConnection类中,如果service意外的发生中断,则此类中的onServiceDisconnected方法将会被调用执行;正常的中断(如:执行unbindService方法),则此类中的onServiceDisconnected方法不会被调用。

3、如果一个Service使用两种模式开启(bindService和startService),则必须保证两个生命周期都结束,才能执行onDestory方法。例如:bindxx--》startxx--》stopxx 或者 startxx--》bindxx--》stopxx,以上两种情况均不会执行onDestory()方法。

4、service与activity使用bindService进行绑定,并不能将service 的生命周期与activity的生命周期绑定。在部分情况下,取消绑定的时候也仅仅是取消service与activity之间的关系,并不能停止该service。

5、service中并不能够执行耗时操作,因为service与所在的应用位于同一个进程,并且service也并不是一条新的线程,如果执行耗时操作,将会出现ANR(Application Not Responding)异常。



2、IntentService执行原理


a>使用队列来管理Intent请求,每当客户端代码通过Intent请求启动IntentService时,IntentService将会把Intent加入队列,然后开启一条新的线程来处理该Intent;


b>对于异步 的startService()请求,IntentService会按次序一次处理队列中的Intent,该线程保证同一时刻只处理一个Intent;


c>IntentService会创建单独的线程来处理onHandleIntent()方法实现的代码,因此开发者无需处理多线程的问题;


d>当消息请求处理完以后IntentService会自动停止,开发者无需调用stopSelf()方法停止service;


e>为Service的onBind()方法提供了默认的实现,默认实现的onBind()返回null;


f>为Service的onstartCommand()方法也提供了默认的实现,该实现会将请求Intent添加到队列中。


3、Service和IntentServiceActivity的最主要区别

IntentService里面能够执行耗时操作,而不会造成UI线程阻塞。



总结:

   上述文章通过在android studio中的运行,完整的展现了Service常用生命周期方法的执行过程,通过了解以上的过程能够方便我们程序的开发,在适当的生命周期,执行对应的方法,这样有助于程序的优化、方便后期的维护和减少内存不必要的浪费,更有助于我们对android底层学习。同时也对Service和IntentService进行了比较,以及IntentService的执行原理。不足之处,请大家不惜赐教。



更多相关文章

  1. Android中几种图像特效处理方法小结
  2. 关于设置activity样式
  3. android TabHost(选项卡)的使用方法
  4. Android动画效果translate、scale、alpha、rotate
  5. Android屏幕禁止休眠的方法
  6. Android(安卓)xxx is not translated in yyy, zzz 的解决方法
  7. Android中数据存储的5中方法
  8. 浅谈Java中Collections.sort对List排序的两种方法
  9. Python list sort方法的具体使用

随机推荐

  1. Android(安卓)NDK Cmake学习记录
  2. Android使用MediaCodec将YUV硬编成H264
  3. Android中Log机制详解
  4. system.img镜像转换为system.new.dat + s
  5. Android(安卓)WebRTC使用解析
  6. Android(安卓)设置StatusBar的颜色
  7. [Android] 压缩图片并保存
  8. android利用Intent.ACTION_SEND实现简单
  9. 使用命令行编译Qt Android(安卓)apps
  10. 让背景小图不是拉伸而是多个重复