文档章节

使用绑定Service的方法实现简易播放功能

陈小默
 陈小默
发布于 2015/09/12 10:26
字数 1001
阅读 34
收藏 0

  绑定Service概念 : 实现了Service组件与Activity组件绑定的操作,即完成了在Activity中直接操作Service的功能的方法.另外,绑定的Service组件的声明周期会受到Activity生命周期的影响

我们先来了解一下绑定Service应有的生命周期方法

@Override
    public void onCreate() {
        //初始化服务组件,整个生命周期中只执行一次
        super.onCreate();
    }
    @Override
    public IBinder onBind(Intent intent) {
        //绑定组件时放回Binder(实现了IBinder)的对象
        return null;
    }
    @Override
    public boolean onUnbind(Intent intent) {
        //解绑方法
        return true;
    }
    @Override
    public void onRebind(Intent intent) {
        //重新绑定时方法,如果onUnbind方法返回true时表示可以重新绑定,否则表示不能重新绑定
        super.onRebind(intent);
    }
    @Override
    public void onDestroy() {
        //销毁服务方法
        super.onDestroy();
    }

我们现在使用绑定的方式完成音乐播放功能

首先时准备工作: 在res资源文件夹下创建一个raw文件夹,其中放入一个音频文件(注意文件名不能包含大写字母,汉字或以数字开头)

1) 新建Service的子类,并重写绑定Service相关声明周期方法


2)创建一个Binder的子类(该类的作用是实现UI组件与服务组件之间的交互),所以要在此类中添加必要的方法用来提供给Activity使用,其实现的过程就是用户不能直接操作Service组件,但用户必须通过Activity作为中间人才能操作服务组件

//在此为了方便表示其中的关系,我使用了内部类的表示方式,该类是MyService的内部类
public class MyBinder extends Binder{
        public MyService getService(){
            return MyService.this;
            //放回MyService对象,使得Activity可以直接调用该对象中的公共方法
        }
    }

3)在MyService的绑定方法中返回该内部类对象

@Override
    public IBinder onBind(Intent intent) {
        return new MyBinder();
    }

4)在Service添加适当的方法用来操作媒体对象

private MediaPlayer player;
    @Override
    public void onCreate() {
        player=MediaPlayer.create(getApplicationContext(), R.raw.music);
        player.setLooping(true);//设置循环播放
    }
    public void start(){
        player.start();
    }
    public void pause(){
        player.pause();
    }
    public void stop(){
        player.stop();
    }

5)在清单文件中注册Service

<application
        <service android:name="com.chen.service.MyService" >
            <intent-filter>
                <action android:name="com.chen.service.MyService" />
            </intent-filter>
        </service>
    </application>

6)在Activity中实例化一个绑定组件之间的通信接口对象ServiceConnection接口

        对此,我们仍用内部类的方式先实现此接口

    private MyService myService;
    public class MyServiceConnection implements ServiceConnection{
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            //此方法为绑定成功后回调的方法,其中第二个参数就是onBind方法返回的Binder对象
            //但是如果想使用此对象需要进行向下转型
            //同过MyBinder定义的方法便可获得Myservice对象
            myService=((MyBinder)service).getService();
        }
        @Override
        public void onServiceDisconnected(ComponentName name) {
            //解除绑定时,调用相应的销毁方法
            myService.onDestroy();
        }    
    }

7)在Activity中的适当位置绑定和解绑服务组件

此时我在oncreate方法中绑定组件

private MyServiceConnection conn;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        intent = new Intent("com.chen.service.MyService");//参数为清单文件中指定的Action
        bindService(intent, conn=new MyServiceConnection(), Context.BIND_AUTO_CREATE);
    }

在ondestory方法中解绑服务

    @Override
    protected void onDestroy() {
        unbindService(conn);
        super.onDestroy();
    }

8)同上一篇博文,我们仍用三个按钮

<Button
        android:id="@+id/play"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:onClick="onClick"
        android:text="播放" />

    <Button
        android:id="@+id/pause"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/play"
        android:onClick="onClick"
        android:text="暂停" />

    <Button
        android:id="@+id/stop"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/pause"
        android:onClick="onClick"
        android:text="停止" />

在Activity中实现监听事件

    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.play:
            myService.start();
            break;
        case R.id.pause:
            myService.pause();
            break;
        case R.id.stop:
            myService.stop();
            break;
        default:
            break;
        }
    }

好了,现在可以运行了,不过有一点小缺陷就是停止后不能再播放了,亲们自己处理以下哈^_^

拜拜,下期再见

© 著作权归作者所有

陈小默
粉丝 6
博文 39
码字总数 31230
作品 0
武汉
程序员
私信 提问
手把手教你做音乐播放器(四)播放服务的搭建

版权声明:本文为博主原创文章,禁止转载,违者必究。 https://blog.csdn.net/anddlecn/article/details/52639111 第4节 播放服务的搭建 播放音乐的服务-是整改音乐播放器的核心,它将播放界...

anddlecn
2016/09/23
0
0
手机影音第十五天,利用service实现后台播放音乐,在通知栏显示当前音乐信息等

代码已经托管到码云上,有兴趣的小伙伴可以下载看看 https://git.oschina.net/joy_yuan/MobilePlayer 先来一张目前的音乐播放器的效果图,当播放时,手机的状态通知栏也会有音乐信息显示。 ...

老婆的宝宝
2017/07/28
0
0
四大组件之Service(一)-双子座的Service-Start Service与Bind Service

版权声明:本文为博主原创文章,禁止转载,违者必究。 https://blog.csdn.net/anddlecn/article/details/51645701 第1节 Service介绍 是安卓系统的四大组件之一。如果说是专门为用户“看”的...

anddlecn
2016/06/12
0
0
Android 进程间通信——Service、Messenger

转载请注明出处:http://blog.csdn.net/vnanyesheshou/article/details/74198534 Android四大组件(二)Service 接着上一篇Service基础知识,这一篇主要说下介绍下绑定的服务端的三种方式:同...

VNanyesheshou
2017/07/12
0
0
Android Service 服务(三)—— bindService与remoteService

一、bindService简介 bindService是绑定Service服务,执行service服务中的逻辑流程。 service通过Context.startService()方法开始,通过Context.stopService()方法停止;也可以通过Service.s...

长平狐
2013/01/06
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

友元函数强制转换

友元函数强制转换 p522

天王盖地虎626
昨天
5
0
js中实现页面跳转(返回前一页、后一页)

本文转载于:专业的前端网站➸js中实现页面跳转(返回前一页、后一页) 一:JS 重载页面,本地刷新,返回上一页 复制代码代码如下: <a href="javascript:history.go(-1)">返回上一页</a> <a h...

前端老手
昨天
4
0
JAVA 利用时间戳来判断TOKEN是否过期

import java.time.Instant;import java.time.LocalDateTime;import java.time.ZoneId;import java.time.ZoneOffset;import java.time.format.DateTimeFormatter;/** * @descri......

huangkejie
昨天
4
0
分页查询

一、配置 /*** @author beth* @data 2019-10-14 20:01*/@Configurationpublic class MybatisPlusConfig { @Bean public PaginationInterceptor paginationInterceptor(){ ......

一个yuanbeth
昨天
6
0
在LINQPad中使用Ignite.NET

LINQPad是进行.NET开发的一款优秀工具,非常有利于Ignite.NET API的快速入门。 入门 下载LINQPad:linqpad.net/Download.aspx,注意要选择64位操作系统的AnyCPU版本; 安装Ignite.NET的NuGet...

李玉珏
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部