zoukankan      html  css  js  c++  java
  • 每日日报2021 5/21

    今天我们接着学习service

    当首次使用bindService绑定一个Service时,系统会实例化一个Service实例,并调用其onCreate()和onBind()方法,然后调用者就可以通过IBinder和Service进行交互了,此后如果再次使用bindService绑定Service,系统不会创建新的Sevice实例,也不会再调用onBind()方法,只会直接把IBinder对象传递给其他后来增加的客户端!
    如果我们解除与服务的绑定,只需调用unbindService(),此时onUnbind和onDestory方法将会被调用!这是一个客户端的情况,假如是多个客户端绑定同一个Service的话,情况如下 当一个客户完成和service之间的互动后,它调用 unbindService() 方法来解除绑定。当所有的客户端都和service解除绑定后,系统会销毁service。(除非service也被startService()方法开启)
    另外,和上面那张情况不同,bindService模式下的Service是与调用者相互关联的,可以理解为 "一条绳子上的蚂蚱",要死一起死,在bindService后,一旦调用者销毁,那么Service也立即终止!
    通过BindService调用Service时调用的Context的bindService的解析 bindService(Intent Service,ServiceConnection conn,int flags)
    service:通过该intent指定要启动的Service
    conn:ServiceConnection对象,用户监听访问者与Service间的连接情况, 连接成功回调该对象中的onServiceConnected(ComponentName,IBinder)方法; 如果Service所在的宿主由于异常终止或者其他原因终止,导致Service与访问者间断开 连接时调用onServiceDisconnected(CompanentName)方法,主动通过unBindService() 方法断开并不会调用上述方法!
    flags:指定绑定时是否自动创建Service(如果Service还未创建), 参数可以是0(不自动创建),BIND_AUTO_CREATE(自动创建)

    如果Service已经由某个客户端通过StartService()启动,接下来由其他客户端 再调用bindService()绑定到该Service后调用unbindService()解除绑定最后在 调用bindService()绑定到Service的话,此时所触发的生命周期方法如下:
    onCreate( )->onStartCommand( )->onBind( )->onUnbind( )->onRebind( )
    PS:前提是:onUnbind()方法返回true!!! 这里或许部分读者有疑惑了,调用了unbindService后Service不是应该调用 onDistory()方法么!其实这是因为这个Service是由我们的StartService来启动的 ,所以你调用onUnbind()方法取消绑定,Service也是不会终止的!
    得出的结论: 假如我们使用bindService来绑定一个启动的Service,注意是已经启动的Service!!! 系统只是将Service的内部IBinder对象传递给Activity,并不会将Service的生命周期 与Activity绑定,因此调用unBindService( )方法取消绑定时,Service也不会被销毁!

    public class TestService1 extends Service {  
        private final String TAG = "TestService1";    
        //必须要实现的方法  
        @Override  
        public IBinder onBind(Intent intent) {  
            Log.i(TAG, "onBind方法被调用!");  
            return null;  
        }  
      
        //Service被创建时调用  
        @Override  
        public void onCreate() {  
            Log.i(TAG, "onCreate方法被调用!");  
            super.onCreate();  
        }  
          
        //Service被启动时调用  
        @Override  
        public int onStartCommand(Intent intent, int flags, int startId) {  
            Log.i(TAG, "onStartCommand方法被调用!");  
            return super.onStartCommand(intent, flags, startId);  
        }  
          
        //Service被关闭之前回调  
        @Override  
        public void onDestroy() {  
            Log.i(TAG, "onDestory方法被调用!");  
            super.onDestroy();  
        }  
    }
  • 相关阅读:
    python3-day6(模块)
    python3-day5(模块)
    python3-day4(re正则表达式,冒泡)
    python3-day4(递归)
    python3-day4(装饰器)
    python3-day3(内置函数)
    python3-day3(函数-参数)
    python3-day3(函数-返回值)
    android 开发学习3
    android 开发学习2
  • 原文地址:https://www.cnblogs.com/song-1/p/14882055.html
Copyright © 2011-2022 走看看