绑定服务的用法

来源:互联网 发布:mac有没有助手 编辑:程序博客网 时间:2024/05/16 14:54

绑定服务的用途

  • 服务有两种启动方法:startService和bindService。
  • startService启动服务后,即使启动他的组件死亡,服务仍然会在后台运行;bindService启动服务后,服务与启动他的组件同生共死。
  • 既然如此,绑定服务似乎就好像失去了服务本来的意义(后台单独运行的进程)。实际上绑定服务最大的用途就是其他进程可以去调用服务里的方法,而这是startService无法做到的。

下面介绍绑定服务的用法:我们模拟做一个音乐播放服务,服务里有开始播放和停止播放的方法需要其他的进程去调用。

代码示例

public class MainActivity extends Activity {    MusicInterface mi;    private MusicServiceConnection conn;    private Intent intent;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        intent = new Intent(this, MusicService.class);        startService(intent);        conn = new MusicServiceConnection();        bindService(intent, conn, BIND_AUTO_CREATE);    }    class MusicServiceConnection implements ServiceConnection {        @Override        public void onServiceConnected(ComponentName name, IBinder service) {            mi = (MusicInterface) service;        }        @Override        public void onServiceDisconnected(ComponentName name) {        }    }    public void play(View v) {        mi.play();    }    public void stop(View v) {        mi.stop();    }}       
  • 主activity我们放置了两个按钮:开始播放和停止播放,点击相应的按钮就可以实现相应的功能(注意这里的方法是绑定服务里的方法)。
  • activity启动时绑定服务,在链接到服务后将服务转成抽象接口,接口里是服务里定义的可以外部进程直接调用的方法。

    public class MusicService extends Service {    @Override    public void onCreate() {        super.onCreate();        System.out.println("onCreate");    }    @Override    public IBinder onBind(Intent intent) {        System.out.println("onBind");        return new MusicController();    }    @Override    public boolean onUnbind(Intent intent) {        System.out.println("onUnbind");        return super.onUnbind(intent);    }    @Override    public void onDestroy() {        super.onDestroy();        System.out.println("onDestroy");    }    class MusicController extends Binder implements MusicInterface{        @Override        public void play() {            MusicService.this.play();        }        @Override        public void stop() {            MusicService.this.stop();        }    }    public void innerMethod(){        System.out.println("我是外部进程不能访问的方法");    }    public void play() {        System.out.println("开始播放");    }    public void stop() {        System.out.println("停止播放");    }}
  • 绑定服务要求返回一个Buider对象,这个对象相当于一个暴露服务里方法给外部进程的中介,这里我们让这个对象实现接口,接口里定义一些允许访问的方法。

    public interface MusicInterface {    void play();    void stop();}
0 0
原创粉丝点击