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

  绑定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;
        }
    }

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

拜拜,下期再见

转载于:https://my.oschina.net/oschenxiaomo/blog/505223

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的Android后台音乐播放器示例代码: 1. 创建一个后台Service ```java public class MusicService extends Service implements MediaPlayer.OnPreparedListener { private MediaPlayer mediaPlayer; @Override public void onCreate() { super.onCreate(); mediaPlayer = new MediaPlayer(); mediaPlayer.setOnPreparedListener(this); } @Override public int onStartCommand(Intent intent, int flags, int startId) { if (intent != null && intent.getAction() != null) { switch (intent.getAction()) { case "play": String url = intent.getStringExtra("url"); playMusic(url); break; case "pause": pauseMusic(); break; case "resume": resumeMusic(); break; case "stop": stopMusic(); break; } } return super.onStartCommand(intent, flags, startId); } private void playMusic(String url) { try { mediaPlayer.reset(); mediaPlayer.setDataSource(url); mediaPlayer.prepareAsync(); } catch (IOException e) { e.printStackTrace(); } } private void pauseMusic() { if (mediaPlayer.isPlaying()) { mediaPlayer.pause(); } } private void resumeMusic() { if (!mediaPlayer.isPlaying()) { mediaPlayer.start(); } } private void stopMusic() { mediaPlayer.stop(); mediaPlayer.reset(); } @Override public void onPrepared(MediaPlayer mp) { mediaPlayer.start(); } @Override public IBinder onBind(Intent intent) { return null; } } ``` 2. 在AndroidManifest.xml声明Service ```xml <service android:name=".MusicService"/> ``` 3. 在Activity启动Service并发送命令 ```java public class MainActivity extends AppCompatActivity implements View.OnClickListener { private EditText etUrl; private Button btnPlay; private Button btnPause; private Button btnResume; private Button btnStop; private Intent musicServiceIntent; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); etUrl = findViewById(R.id.et_url); btnPlay = findViewById(R.id.btn_play); btnPause = findViewById(R.id.btn_pause); btnResume = findViewById(R.id.btn_resume); btnStop = findViewById(R.id.btn_stop); btnPlay.setOnClickListener(this); btnPause.setOnClickListener(this); btnResume.setOnClickListener(this); btnStop.setOnClickListener(this); musicServiceIntent = new Intent(this, MusicService.class); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_play: String url = etUrl.getText().toString(); musicServiceIntent.setAction("play"); musicServiceIntent.putExtra("url", url); startService(musicServiceIntent); break; case R.id.btn_pause: musicServiceIntent.setAction("pause"); startService(musicServiceIntent); break; case R.id.btn_resume: musicServiceIntent.setAction("resume"); startService(musicServiceIntent); break; case R.id.btn_stop: musicServiceIntent.setAction("stop"); startService(musicServiceIntent); break; } } } ``` 这样就可以实现一个简单的后台音乐播放器了。注意,此示例代码并没有考虑到后台播放时的系统通知等功能,如需要可以自行添加。同时,由于示例代码没有使用前台服务,为了避免被系统杀死,需要在Service定期调用startForeground方法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值