服务简介

服务Service

就是默默运行在后台的组件,可以理解为是没有前台的activity,适合用来运行不需要前台界面的代码

服务可以被手动关闭,不会重启,但是如果被自动关闭,内存充足就会重启

开启服务的两种方式

服务对象是不可以被new滴,只能依靠系统来创建服务对象

  • startService()
    • 该方法启动的服务所在的进程属于服务进程。
    • 服务一旦启动,服务便和活动没有关系
  • bindService()
    • 该方法启动的服务所在的进程不属于服务进程。
    • Activity与服务建立连接,服务与启动它的Activity同生共死
    • 任何一个服务在整个应用程序范围内都是通用的,单例设计模式,一个服务可以和多个Activity绑定
    • 绑定服务和解绑服务的生命周期方法:onCreate->onBind->onUnbind->onDestroy

活动和服务进行通信

使用startService()方式启动服务,服务是不能和活动进行通信,必须使用bindService()方式启动服务(活动和服务进行绑定),才可以实现活动和服务进行通信

  • 调用bindService (Intent service, ServiceConnection conn, int flags)方法将活动和服务进行绑定,此绑定方法有三个参数

    • Intent service:Intent意图对象

    • ServiceConnection conn:活动和服务的连接对象ServiceConnection

    • int flags:一个标志位

      Intent intent = new Intent(this, MyService.class);
       bindService(intent, conn, BIND_AUTO_CREATE);
      
  • 实现ServiceConnection接口,创建一个子类,实现接口的两个方法:onServiceConnected(ComponentName name, IBinder service)onServiceDisconnected(ComponentName name)

    • onServiceConnected(ComponentName name, IBinder service):服务连接成功时,此方法被调用

    • onServiceDisconnected(ComponentName name):服务失去连接时,此方法被调用

      class MyConnection implements ServiceConnection{
      
          @Override
          public void onServiceConnected(ComponentName name, IBinder service) {
              //绑定服务时,返回的Binder对象
              broker = (Broker)service;
          }
      
          @Override
          public void onServiceDisconnected(ComponentName name) {
              
          }
      
      

    }
    ```

  • 调用bindService()方法将活动和服务进行绑定,绑定的服务类中的public IBinder onBind(Intent intent)方法会被系统调用,传入的参数是绑定给服务的Activity,方法返回的是一个IBinder对象,此对象可通过连接对象中的onServiceConnected(ComponentName name, IBinder service)方法的参数IBinder service向下转型得到,通过此对象就可以实现活动和服务进行通信

    class Broker extends Binder{
        public void work(){
            money();
        }
    }
    

两种启动模式的混合使用

使用startService()方法启动的服务所在的进程属于服务进程,但活动和服务并没有进行连接,也无法去调用服务里的方法;使用bindService()方法启动的服务所在的进程不属于服务进程,服务和启动此活动的服务同生共死,活动和服务进行了连接,可以调用服务内部的方法。

  • 两种启动方式混合使用,调用startService()是为了使服务所在的进程属于服务进程,调用bindService()是为了可以和服务进行通信

  • 先调用startService()方法创建并启动服务,再调用bindService()方法绑定服务,欲销毁时,先调用unbindService()方法解绑服务,再调用stopService销毁服务

你可能感兴趣的:(服务简介)