Android开发经验笔记

绑定Service

2015-01-16  本文已影响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();
            }
        });         
    }

}
上一篇 下一篇

猜你喜欢

热点阅读