Android学习——Service(二)

今天来介绍Service的第二种使用方式,Bind方式

 

Bind方式启动服务


Bind方式和Start方式启动很类似,都是通过Intent来启动,不同的是,Bind方式需要传入三个参数,如下:

Intent intent2 =new Intent(MainActivity.this,BindService.class);
bindService(intent2,conn,BIND_AUTO_CREATE);

其中conn为一个ServiceConnection对象,用于获取以Bind方式绑定的Service对象,其包含两个抽象函数,如下:

conn=new ServiceConnection()
        {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service)
            {
                bindservice=((BindService.MyBinder)service).getService();
            }

            @Override
            public void onServiceDisconnected(ComponentName name)
            {

            }
        };

其中的onServiceDisconnected为当Service的绑定意外丢失时会调用,在该例中没有用到。

其中onServiceConnected为当ServiceConnextion对象和Service成功绑定时回调用的方法,其中的IBinder参数正是在Service中的onBind方法的返回值类型。故我们只需要在Service中,新建一个IBinder的子类,获取Service对象即可。

 

在Service中创建IBinder接口


public class BindService extends Service
{
    public class MyBinder extends Binder
    {
        public BindService getService()
        {
            return BindService.this;
        }
    }
    @Nullable
    @Override
    public IBinder onBind(Intent intent)
    {
        Log.d("Jinx","Bind");
        return new MyBinder();
    }

如上所示即可,其中Binder为IBinder的一个子类,我们的内部类继承Binder即可。

 

在Activity获取Service中的方法


在通过conn进行关联后,便可以方便地在Activity中调用Service中的方法,如下代码虚拟了一个音乐播放器为例:

Service中:

public void Play()
    {
        Log.d("Jinx","Play");
    }
    public void Pause()
    {
        Log.d("Jinx","Pause");
    }

 

Activity中:

case R.id.play_bt:
                bindservice.Play();
                break;
            case R.id.pause_bt:
                bindservice.Pause();
                break;
posted @ 2017-04-09 20:54  JinxMiracle  阅读(128)  评论(0编辑  收藏  举报