Service

作者: 老北瓜 | 来源:发表于2020-02-04 20:40 被阅读0次

    Service:

    1,四大组件之一, 相当于一个没有界面的Activity
    2,用于在后台处理耗时操作, 音乐播放,下载
    3,不受Activity生命周期影响,有自己的生命周期

    服务的两种启动方式: 对应两种生命周期


    Service生命周期.jpg

    startService 启动方式:
    Intent intent = new Intent();
    startService(this,MyService.class);
    停止服务 :
    stopService(intent);

    MyService 服务也就有且仅有一个,如果多次调用startService(),操作的都是同一个Service对象,不会再重新创建;如果t退出app,不会销毁Service  
    

    生命周期:
    ...
    bindService 启动方式:
    bindService(new Intent(), ServiceConnection(),
    BIND_AUTO_CREATE)

    停止方式:
        unBindService( ServiceConnection());  ```
    ServiceConnection 是连接Service 与 客户端的桥梁;
    
    bindService()并不会让 Service在后台运行起来,只有startService()
    如果服务不存在 :onCreate ->onBind ->onUnBind -> onDestroy , 不会在后台运行起来,并会随着Activity的销毁而销毁。之所以会调用onCreate,是因为 bindService()第三个参数BIND_AUTO_CREATE,会自动调用onCreate()
    如果服务已经存在 :  那么bindService 只会调用onBind ,unBindService 只会调用onUnbind, 不调用onDestroy().
    

    后台耗时操作应该使用startService().
    bindService的作用 是用来实现对Service执行的任务进行进度监控
    比如获取下载进度。
    而耗时操作就放在onCreate()中执行,仅一次,并且不会受到其他操作的影响。
    涉及到 IBinder 和 ServiceConnection
    IBinder 是 Android 中用于远程操作对象的一个基本接口
    Binder() 实现了 IBinder 接口, 对于onBind()而言,实际上会自己定义内部类集成Binder类,并返回。
    class MyBinder extends Binder{
    // 定义自己需要的方法 , 具体业务,比如实现进度监控
    public int getProcess(){
    return i;
    }
    }
    这样一种情形 : startService() - > bindService() -> unbindService(),如果再次调用bindService(),没有执行onBind(), 这里的onBind 只会执行一次,后续的监控都要依靠ServiceConnection 来实现


    image.png

    IBinder 与ServiceConnection的关系,
    在onServiceConnectioned(ComponentName name,iBinder ibinder)
    和 onBind()的返回值中都有一个iBinder 对象 , onBind()的返回值可以作为
    onServiceConnectioned()的参数
    MyBinder myBinder = (MyBinder)iBinder;
    myBinder.getProcess(), 就可以拿到Service 中的进度 i ;
    并且 bindService() 与 unbinderService() 不会影响到 耗时任务的进度。
    执行过程是 先 startService(), 再bindService() .就可以进行进度监控

    相关文章

      网友评论

          本文标题:Service

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