绑定Service

作者: 陈利健 | 来源:发表于2015-01-16 21:33 被阅读123次

    1.创建一个Service的子类
    2.在AndroidManifest.xml中配置该Service

    tips:创建Service子类之后会自动生成public IBinder onBind(Intent arg0)方法,这是一个必须实现的方法,返回值是一个IBinder对象。为了得到IBinder对象,就需要在这个Service子类中定义一个内部类public class MyBinder extends Binder


    AndroidManifest.xml

        <service android:name=".BindService">
            <intent-filter >
                <action android:name="com.chenlijian.bindservice.Bind_SERVICE"/>
            </intent-filter>
        </service>
    

    BindService.java

    public class BindService extends Service {
        private int count;
        private boolean quit = false;
    
        //自动生成的方法,当其它应用组件(activity)绑定至当前service对象时,就会调用此方法,来返回一个IBinder对象。
        @Override
        public IBinder onBind(Intent arg0) {
            //为了返回一个IBinder对象,就得先实例化一个IBinder对象
            IBinder binder = new MyBinder();
            return binder;
        }
    
        //IBinder是一个接口,所以通常需要继承IBinder的实现类Binder来实现了一个IBinder对象,这个类声明为内部类
        public class MyBinder extends Binder{
            public int getCount(){
                return count;
            }
        }
        
        @Override
        public void onCreate() {
            super.onCreate();
            //创建这个service的作用是:启动一条线程每隔1s动态地递增count的值
            new Thread(){
                public void run(){
                    while(!quit){
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        count++;
                    }
                }
            }.start();
        }
    
        @Override
        public void onDestroy() {
            super.onDestroy();
            //service被关闭前回调该方法,将quit改为true,停止递增count
            this.quit = true;
        }
    
        @Override
        public boolean onUnbind(Intent intent) {
            return super.onUnbind(intent);
        }
        
    }
    

    MainActivity.java

    public class MainActivity extends Activity {
    
        Button bind, unbind, getServiceStatus;
        MyBinder binder;
        
        //定义一个ServiceConnection对象(这个定义一定要放在下面的函数上面)
        private ServiceConnection conn = new ServiceConnection() {
            @Override
            //当activity和service成功连接时回调此方法,
            public void onServiceConnected(ComponentName name, IBinder service) {
                binder = (MyBinder) service;
            }
            @Override
            public void onServiceDisconnected(ComponentName name) {}
        };
                
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            bind = (Button) findViewById(R.id.button1);
            unbind = (Button) findViewById(R.id.button2);
            getServiceStatus = (Button) findViewById(R.id.button3);
            //创建启动Service的Intent,并设置Action属性
            final Intent intent = new Intent();
            intent.setAction("com.chenlijian.bindservice.Bind_SERVICE");
            
            bind.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    //通过intent参数,绑定制定Service,并指定(如果Service没有创建而自动创建)
                    //第二个参数是一个ServiceConnection对象(下面会去创建),当绑定连接时,会去调用ServiceConnection的onServiceConnected方法
                    bindService(intent, conn, Service.BIND_AUTO_CREATE);
                }
            });
            
            unbind.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    //当断开绑定时,会去调用ServiceConnection的onServiceDisconnected方法
                    unbindService(conn);
                }
            });
            
            getServiceStatus.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(MainActivity.this, "Service的count值为:"+ binder.getCount(), Toast.LENGTH_LONG).show();
                }
            });         
        }
    
    }
    

    相关文章

      网友评论

        本文标题:绑定Service

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