Android 拾遗(三) Service

  • Service 的应用场景以及和 Thread 的区别

    • service 是什么

        Service(服务)是一个可以在后台执行长时间操作而没有用户界面的组件
      
    • Service 和 Thread 的区别

      1、Service是系统的四大组件之一,Thread只是一个用来执行后台任务的工具类
      2、Service可以设置独立的进程;Thread不可以,只能存在于进程中。
      3、Service有自己的生命周期。如果是以bind的方式启动,生命周期跟activity相同。如果是以start方式启动,不调用stop会一直运行在后台;Thread运行完了就结束了,启动后跟activity没有关系了,哪怕activity结束了,thread也会在后台运行。
      4、不同的Activity可以调用同一个Service;不同的Activity不能调用同一个Thread。
      5、Service如果是运行在后台的,可以注册接收系统或自定义广播;Thread不能接收广播
      6、不同的应用程序可以共享同一Service,但不能共享同一Thread。
      7、service中可以创建thread,避免ANR。
      8、Thread在后台运行(Activty stop)的优先级低于后台运行的Service,如果执行系统资源紧张,会优先杀死前一种,后台运行的Service一般情况下不会被杀死,如果被杀死,系统空闲时会重新启动service.

    什么时候用Service,什么时候用多线程?
    从逻辑上你认为需要一个后台操作,但跟我们现在主线程操作通讯频繁,逻辑关系紧密,就用多线程(直接用)
    比如你要下载图片,然后在当前activity上显示,那就用多线程
    能够从逻辑上区分开来,又或者耗时较长,就用后台服务
    比如下载电影就用service,这样即使来电话了,也不影响下载

  • 开启 Service 的两种方式以及区别

    Android 拾遗(三) Service_第1张图片
    28EC04EC-A57C-4A28-9919-3C45D9F924B6.png
     1、在调用 bindService 绑定到Service的时候,你就应当保证在某处调用 unbindService 解除绑定(尽管 Activity 被 finish 的时候绑定会自      动解除,并且Service会自动停止);

     2、 使用 startService 启动服务之后,一定要使用 stopService停止服务,不管你是否使用bindService; 

     3、同时使用 startService 与 bindService 要注意到,Service 的终止,需要unbindService与stopService同时调用,才能终止 Service,不管 startService 与 bindService 的调用顺序,如果先调用 unbindService 此时服务不会自动终止,再调用 stopService 之后服务才会停止,如果先调用 stopService 此时服务也不会终止,而再调用 unbindService 或者 之前调用 bindService 的 Context 不存在了(如Activity 被 finish 的时候)之后服务才会自动停止;

     4、当在旋转手机屏幕的时候,当手机屏幕在“横”“竖”变换时,此时如果你的 Activity 如果会自动旋转的话,旋转其实是 Activity 的重新创建,因此旋转之前的使用 bindService 建立的连接便会断开(Context 不存在了),对应服务的生命周期与上述相同。
    
     5、Service 是android的一种机制,当它运行的时候如果是Local Service,那么对应的 Service 是运行在主进程的 main 线程上的。如果是Remote Service,那么对应的 Service 则是运行在独立进程的 main 线程上,service和调用者之间的通讯都是同步的(不论是远程service还是本地service)
    
    > 6、Thread 的运行是独立于 Activity 的,也就是说当一个 Activity 被 finish 之后,如果你没有主动停止 Thread 或者 Thread 里的 run 方法没有执行完毕的话,Thread 也会一直执行。因此这里会出现一个问题:当 Activity 被 finish 之后,你不再持有该 Thread 的引用,也就是你下次启动的时候,无法控制之前创建的线程,而service则可以。另一方面,你没有办法在不同的 Activity 中对同一 Thread 进行控制。

你可能感兴趣的:(Android 拾遗(三) Service)