• 谈Android四大组件之Service篇


    Service简介

     Service是Android系统中的四大组件之一,它是一种长生命周期的,没有可视化界面,运行于后台的一种服务程序。Service必须在AndroidManifest.xml中声明。Service有自己的生命周期,可以使用startService()启动一个Service或使用bindService()方法绑定一个已经存在的Service。


    Service作用

      比如我们播放音乐的时候,有可能想边听音乐边干些其他事情,当退出播放音乐的应用,如果不用Service,我们就听不到歌了,所以这时候就得用到Service了。


    Service的生命周期

      Service的生命周期没有Activity那么复杂,它只继承了onCreate(),onStart(),onDestroy()三个方法,当第一次启动Service时,先后调用了onCreate(),onStart()这两个方法,当停止Service时,则执行onDestroy()方法,这里需要注意的是,如果Service已经启动了,当我们再次启动Service时,不会在执行onCreate()方法,而是直接执行onStart()方法。


    Service的启动方法

      Service的有两种启动方式:Context.startService()Context.bindService(),这两种方式对Service生命周期的影响是不同的。
        1.Context.startService()方式启动
          Context.startService()方式的生命周期: 
          启动时,startService –> onCreate() –> onStart()
          停止时,stopService –> onDestroy()


          如果调用者直接退出而没有停止Service,则Service 会一直在后台运行
          Context.startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onStart()方法。


          如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调用onStart()方法。采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。

          代码如下:

    //创建Intent
    Intent intent=new Intent();
    Intent.setAction(“com.my.action.MY_SERVICE”);
    
    //启动Service
    startService(intent);
    
    //停止一个Servcie
    stopService(intent);


        2.Context.bindService()方式启动:
          Context.bindService()方式的生命周期:
          绑定时,bindService() -> onCreate() –> onBind()
          调用者退出了,即解绑定时,
          Srevice就会unbindService() –>onUnbind() –> onDestory()

          用Context.bindService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onBind()方法。这个时候调用者和服务绑定在一起。

          调用者退出了,系统就会先调用服务的onUnbind()方法,接着调用onDestroy()方法。如果调用bindService()方法前服务已经被绑定,多次调用bindService()方法并不会导致多次创建服务及绑定(也就是说onCreate()和onBind()方法并不会被多次调用)。

          如果调用者希望与正在绑定的服务解除绑定,可以调用unbindService()方法,调用该方法也会导致系统调用服务的onUnbind()-->onDestroy()方法。


          绑定Service需要三个参数:bindService(intent, conn, Service.BIND_AUTO_CREATE);
          第一个:Intent对象
          第二个:ServiceConnection对象,创建该对象要实现它的onServiceConnected()和 onServiceDisconnected()来监听Service连接和断开消息

    //连接对象
    ServiceConnection conn = new ServiceConnection() {
       
       //连接时调用
      public void onServiceConnected(ComponentName name, IBinder service){
                   Log.i(“Service”, "连接成功");
    }
    //断开时调用
    public void onServiceDisconnected(ComponentName name) {
       Log.i(“Service”, “断开连接”);
    }
    };

           第三个:创建Service方法,一般指定绑定的时候自动创建


        Service生命周期视图:



    Service使用需要注意的问题

      1.ServiceConnection 的回调方法onServiceDisconnected() 在连接正常关闭的情况下是不会被调用的, 该方法只在Service 被破坏了或者被杀死的时候调用. 例如, 系统资源不足, 要关闭一些Services, 刚好连接绑定的 Service 是被关闭者之一,  这个时候onServiceDisconnected() 就会被调用。

      2.如果Service和调用者不是在同一个进程,则不可以在ServiceConnection的回调方法onServiceConnected中将service强制类型转换,在Debug中可以发现onServiceConnected的service的类型为BinderProxy

  • 相关阅读:
    使用Java实现对MySql数据库的导入与导出
    【转】揭开J2EE集群的神秘面纱
    Memcached深度分析
    HSQL入门及使用指南
    系统架构基础篇(高性能基础建设说明与选型条件)
    架构之美 摘抄
    JMS规范及相关实现
    spring3中使用@value注解获取属性值
    Thread Dump 分析综述
    什么中间件及中间件服务器?
  • 原文地址:https://www.cnblogs.com/fuhaots2009/p/3372065.html
Copyright © 2020-2023  润新知