• Service相关总结


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

    Service是什么

    Service非常重要,可以用于在后台执行耗时逻辑,或者执行某些需要长时间运行的任务,而且不会看到界面。
    甚至可以在程序退出的时候,让service仍然存活一段时间。

    Service是一种可以在后台执行长时间运行操作而没有用户界面的组件。

    注意:

    Service和BroadCast都是运行在主线程,所以不能用来做长时间的耗时操作。

    Service和Thread的区别

    1.定义:

    1. Thread是程序执行的最小单元,是分配cpu的基本单位。安卓中的UI线程等都是线程的一种。

    2. Service是安卓中的一种特殊机制,service是运行在主线程中的,不能做耗时操作。使用系统进程托管。
      服务和子线程以及服务和后台是两个完全不同的概念。安卓的服务指的是不依赖UI界面。
      如果一定要在service里面做耗时操作,也要在service里创建子线程。

    2.实际开发
    在安卓中,线程一般指的是做耗时操作的线程,而主线程是一种特殊的工作线程,负责处理UI的绘制。主线程里不能做耗时操作

    service是安卓四大组件之一,一般运行在主线程当中

    3.应用场景
    当需要执行耗时的网络操作,文件数据的查询,以及其他可能阻塞主线程运行的操作时就要开启子线程来执行。

    需要在后台长时间运行并且不需要界面的一些操作,常放在service里执行,比如后台播放音乐,一些数据统计等。

    为什么不直接在activity里面创建子线程而要去service里面创建子线程

    当activity被销毁后,没有办法获取之前创建的子线程。
    service创建子线程,activity就可以放心的销毁,不用担心出现对后台任务无法控制的情况。

    Service生命周期方法介绍

    onCreate:
    1.当Service创建时被调用。如果service已经在运行了,那么不会在调用;
    2.可以在其中做一些初始化操作;

    onStartCommand:
    1.通过startService方法启动service时调用;
    2.在onStartCommand方法中,可以执行后台任务,由于service是运行在主线程,所以如果是耗时任务则需要开启子线程来执行;
    3.在service完成任务之后,组件需要通过调用stopService来停止service,或者由service调用stopSelf来自我终止;
    4.如果返回值为START_STICK是什么意思:
    当整个service因为系统内存不足被杀掉之后,一段时间当内存再次空闲的时候,系统会尝试重新创建这个service,一旦重新创建成功之后,又会调用onStartCommand方法,这时候传的intent为null;

    onBind:
    1.当有组件调用bindService方法与service进行绑定时回调;
    2.在onBind方法中,可以返回一个IBinder对象来提供一个接口,供客户端与service通信;

    onUnbind:
    1.在组件调用onUnbind方法,与service解除绑定时回调;

    onDestroy:
    1.service停止运行将被销毁时回调;

    2.什么时候停止运行:
    当通过startService启动service时,需要组件调用stopService或者service自己执行stopSelf方法时停止运行;
    当通过bindService启动service是,需要组件调用onUnbind方法来解除绑定。当所有绑定解除时,service停止运行;

    3.在onDestroy时,我们应该释放所有资源,包括子线程、注册的监听器和广播接收者等。

    开启Service的两种方式和区别

    startService

    1.定义一个类继承Service;
    2.在manifest.xml中配置该service;
    3.使用Context的startService(Intent)方法启动该Service;
    4.不再使用时,调用stopService(Intent)方法停止该服务;

    通过startService启动服务后,服务处于开启状态,而一旦服务启动后,没有手动调用stopService,service会一直运行。这时候如果activity被销毁了,对service的运行也没有影响。

    bindService

    1.创建BindService服务端,继承自Service并在类中创建一个实现IBinder接口的实例对象,并提供公共方法给客户端调用;
    2.从onBind回调方法中返回此binder实例;
    3.在客户端中,从onServiceConnected回调方法中接收binder,并使用提供的方法调用绑定服务;

    这里客户端指的Activity,服务端指的Service

    调用bindService方法启动Service,Service和Activity是一种绑定状态。
    提供了Activity和Service交互的接口,允许Activity和Service进行数据交互,发送请求获取结果等操作。甚至Service和Activity在不同的进程中,可以进行进程间通信来传输数据。这些都需要Service绑定到Activity之后才能运行。
    多个Activity可以绑定同一个Service,但是绑定全部解绑后,这个服务就会被自动销毁。不需要像startService启动需要手动调用stopService来停止服务。

    onServiceConnected 和 onServiceDisConnected方法

    image

    onServiceConnected:
    与服务端交互的接口方法,绑定服务的时候被回调;
    在这个方法获取绑定Service传递过来的IBinder对象,通过这个IBinder对象,实现Activity与Service的交互;

    onServiceDisconnected:
    当取消绑定的时候被回调,但正常情况下是不会被调用的;
    它的调用时机是当Service服务被意外销毁时,例如内存资源不足是这个方法才被自动调用;

  • 相关阅读:
    A magic method allowing a third variable used in comparison function of std::sort
    Create a wireframe box in rviz but not using any other extra tools (unfinished)
    Three methods to iterate every point in pointcloud of PCL(三种遍历点云的方式)
    Environment Perception: 3D Truss Environment Mapping and Parametric Expression Extraction
    shell脚本练习02--求字符串的长度
    shell脚本练习01
    shell脚本,循环的记录
    linux 备份最近一天的文件
    mybatis和java一些知识记录
    第8章
  • 原文地址:https://www.cnblogs.com/cfdroid/p/16450100.html
Copyright © 2020-2023  润新知