美文网首页android-service
bindService启动服务

bindService启动服务

作者: xuefeng_apple | 来源:发表于2020-03-12 15:55 被阅读0次

一般情况下我们使用startService(Intent service)来启动一个服务,但这种情况下无法得到Service对象的引用,通过bindService方法启动服务则可以实现此功能。

加深理解:
参数:IBinder service, 实际返回的是 MyService 函数onBind binder 既是IBinder类型,获取IBinder (private final IBinder binder=new MyBinder(); ) ,因此在LocalServiceActivity 就可以调用到service 中 的函数(myService.excute(); )
MyService onBind 实现:

        public IBinder onBind(Intent intent) {  
            return binder;  
        }  

LocalServiceActivity ServiceConnection 实现,为绑定做准备:

            @Override  
            public void onServiceConnected(ComponentName name, IBinder service) {  
                myService = ((MyService.MyBinder) service).getService();  
                System.out.println("Service连接成功");  
                //执行Service内部自己的方法  
                myService.excute();  
            }  

下面给一个小例子演示一下:

    package com.zhf.local;        
    import android.app.Activity;  
    import android.content.ComponentName;  
    import android.content.Context;  
    import android.content.Intent;  
    import android.content.ServiceConnection;  
    import android.os.Bundle;  
    import android.os.IBinder;  
      
    /** 
     * 此例的目的就是拿到MyService的引用,从而可以引用其内部的方法和变量 
     * @author Administrator 
     * 
     */  
    public class LocalServiceActivity extends Activity {  
        /** Called when the activity is first created. */  
        private MyService myService;  
      
        @Override  
        public void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.main);  
      
            Intent intent = new Intent(this, MyService.class);  
            bindService(intent, connection, Context.BIND_AUTO_CREATE);  
        }  
      
        private ServiceConnection connection = new ServiceConnection() {  
      
            @Override  
            public void onServiceDisconnected(ComponentName name) {  
                myService = null;  
            }  
      
            @Override  
            public void onServiceConnected(ComponentName name, IBinder service) {  
                myService = ((MyService.MyBinder) service).getService();  
                System.out.println("Service连接成功");  
                //执行Service内部自己的方法  
                myService.excute();  
            }  
        };  
      
        protected void onDestroy() {  
            super.onDestroy();  
            unbindService(connection);  
        };  
    }  

2.服务者

    package com.zhf.local;  
      
    import android.app.Service;  
    import android.content.Intent;  
    import android.os.Binder;  
    import android.os.IBinder;  
      
    public class MyService extends Service {  
        private final IBinder binder=new MyBinder();  
        @Override  
        public IBinder onBind(Intent intent) {  
            return binder;  
        }  
          
        public class MyBinder extends Binder{  
            MyService getService(){  
                return MyService.this;  
            }  
        }  
          
        public void excute(){  
            System.out.println("通过Binder得到Service的引用来调用Service内部的方法");  
        }  
      
        @Override  
        public void onDestroy() {  
            //当调用者退出(即使没有调用unbindService)或者主动停止服务时会调用  
            super.onDestroy();  
        }  
      
        @Override  
        public boolean onUnbind(Intent intent) {  
            //当调用者退出(即使没有调用unbindService)或者主动停止服务时会调用  
            System.out.println("调用者退出了");  
            return super.onUnbind(intent);  
        }  
    }  

相关文章

网友评论

    本文标题:bindService启动服务

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