<Android> service详解 (二)

本文深入探讨了Android Service的实现原理,重点讲解了如何通过IBinder对象实现Service与访问者之间的通信,包括Service类的定义、onBind()方法的作用、以及Activity绑定Service并访问其状态的流程。

上一篇说的是service与访问者之间不需要通信或者数据交换,如果service与访问者之间需要进行方法调用或者是数据交换,则需要使用bindService()和unbindService()方法启动,关闭service。

开发service类时,该service类必须提供一个IBinder onBind(Intent intent)方法,在绑定本地service的情况下,onBind()方法所返回的IBind对象将会传给ServiceConnection对象里onServiceConnection(ComponentName name ,IBinder service)方法的service参数,这样访问者就可以通过给IBinder对象与service进行通信。

所以只需要在自己定义的service类中实现自己的IBinder对象,并实现onbind()方法,并让该方法返回一个有效的IBinder对象。

public class firstService extends Service {

    private int count;
    private boolean quit;
    private MyBinder binder = new MyBinder();

    public class MyBinder extends Binder{

        public int getCount()
        {
            return count;
        }

    }

    /*
    必须实现的方法,
    方法返回一个Ibind对象,应用程序可以通过该对象与Service组件通信
     */
    @Override
    public IBinder onBind(Intent intent) {
        return binder;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        //被关闭之前回调该方法
        this.quit = true;

    }

    @Override
    public void onCreate() {
        super.onCreate();
        //被创建时回调该方法,动态修改count的值
        new Thread()
        {
            @Override
            public void run() {
                while(!quit)
                {
                    try
                    {
                        Thread.sleep(1000);
                    }
                    catch (InterruptedException e)
                    {

                    }
                    count++;
                }
            }
        }.start();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return super.onStartCommand(intent, flags, startId);
        //被启动时回调该方法
    }
}
onBind()方法可以返回一个IBinder对象,该对象将被传给service的访问者。

接下来就是定义一个Activity来绑定service,并通过MyBinder对象访问service的内部状态。

public class MainActivity extends Activity {

    Button bind,unbind,getService;
    firstService.MyBinder myBinder;

    private ServiceConnection conn = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            myBinder = (firstService.MyBinder) service;
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        bind = (Button) findViewById(R.id.button_bind);
        unbind = (Button) findViewById(R.id.button_unbind);
        getService = (Button) findViewById(R.id.button_getService);

        final Intent intent = new Intent();
        intent.setAction("text.Service.MyFirstService");

        bind.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) {
                //绑定service,第三个参数是自动创建service如果从未被创建的话
                bindService(intent,conn, Service.BIND_AUTO_CREATE);
            }
        });

        unbind.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) {
                //解除service
                unbindService(conn);
            }
        });
        getService.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) {//显示count值,访问service的运行状态
                Toast.makeText(MainActivity.this,"count="+binder.getCount(),Toast.LENGTH_LONG).show();
            }
        });
    }
}
之前看过一个形容,IBinder对象相当于servic组件的内部钩子,钩子关联到绑定的service组件,当其他程序组件绑定该service时。service将会把IBinder对象返回给其他程序组件,其他程序组件通过该IBinder对象即可与service组件进行实时通信。

上面的简单例子表明,activity可以非常方便的访问到 service的运行状态,完全可以让MyBinder去操作service中的更多数据。


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值