• Android通过startService播放背景音乐简单演示样例


    关于startService的基本使用概述及其生命周期可參见博客《Android中startService的使用及Service生命周期》。

    本文通过播放背景音乐的简单演示样例,演示startService的基本使用流程。

    系统界面例如以下:
    这里写图片描写叙述

    界面上面就两个button。”播放音乐并退出Activity” 和 “停止播放音乐”。

    我们在该演示样例中。通过操纵Activity的button控制MusicService播放或停止播放音乐。

    我将一个名为music.mp3的放到资源目录/res/raw目录以下,这样我们在程序中就行通过R.raw.music引用该音乐文件,放入/res/raw目录中的资源文件会保持原来的面貌不会被编译成二进制。

    MusicService是用于播放背景音乐的Service。其代码例如以下所看到的:

    package com.ispring.startservicedemo;
    
    import android.app.Service;
    import android.content.Intent;
    import android.media.MediaPlayer;
    import android.os.IBinder;
    import android.widget.Toast;
    
    import java.io.IOException;
    
    public class MusicService extends Service {
    
        private MediaPlayer mediaPlayer = null;
    
        private boolean isReady = false;
    
        @Override
        public void onCreate() {
            //onCreate在Service的生命周期中仅仅会调用一次
            super.onCreate();
    
            //初始化媒体播放器
            mediaPlayer = MediaPlayer.create(this, R.raw.music);
            if(mediaPlayer == null){
                return;
            }
    
            mediaPlayer.stop();
            mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
                @Override
                public boolean onError(MediaPlayer mp, int what, int extra) {
                    mp.release();
                    stopSelf();
                    return false;
                }
            });
    
            try{
                mediaPlayer.prepare();
                isReady = true;
            } catch (IOException e) {
                e.printStackTrace();
                isReady = false;
            }
    
            if(isReady){
                //将背景音乐设置为循环播放
                mediaPlayer.setLooping(true);
            }
        }
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            //每次调用Context的startService都会触发onStartCommand回调方法
            //所以onStartCommand在Service的生命周期中可能会被调用多次
            if(isReady && !mediaPlayer.isPlaying()){
                //播放背景音乐
                mediaPlayer.start();
                Toast.makeText(this, "開始播放背景音乐", Toast.LENGTH_LONG).show();
            }
            return START_STICKY;
        }
    
        @Override
        public IBinder onBind(Intent intent) {
            //该Service中不支持bindService方法,所以此处直接返回null
            return null;
        }
    
        @Override
        public void onDestroy() {
            //当调用Context的stopService或Service内部运行stopSelf方法时就会触发onDestroy回调方法
            super.onDestroy();
            if(mediaPlayer != null){
                if(mediaPlayer.isPlaying()){
                    //停止播放音乐
                    mediaPlayer.stop();
                }
                //释放媒体播放器资源
                mediaPlayer.release();
                Toast.makeText(this, "停止播放背景音乐", Toast.LENGTH_LONG).show();
            }
        }
    }

    MusicActivity的代码例如以下所看到的:

    package com.ispring.startservicedemo;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    
    
    public class MusicActivity extends Activity implements Button.OnClickListener {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_music);
        }
    
        @Override
        public void onClick(View v) {
            if(v.getId() == R.id.btnStart){
                //播放背景音乐
                Intent intent = new Intent(this, MusicService.class);
                startService(intent);
                //退出当前Activity
                this.finish();
            }else if(v.getId() == R.id.btnStop){
                //停止播放音乐
                Intent intent = new Intent(this, MusicService.class);
                stopService(intent);
            }
        }
    }

    当我们单击了button”播放音乐并退出Activity”之后。我们首先通过Activity的startService启动MusicService。然后我们马上调用了Activity的finish方法销毁了当前的Activity。可能大家会问为什么要销毁当前的Activity?我们此处之所以调用Activity的finish方法不是从功能的角度出发的,而是从理解代码运行的角度有益这么写的: 运行完Activity的finish方法之后。当前的Activity就销毁了, 在界面上看起来就是当前UI消失了,应用程序退出了。但稍等片刻你会听到背景音乐响起。这从側面印证了Service的一个特性: Service与Activity等一样,也是一种主要的应用程序组件,Service无需依赖不论什么的Activity便可独自在没有不论什么UI界面的情况下悠闲地在Android后台默默运行。

    调用了startService之后,Android Framework接收到了intent信息,第一次会先创建MusicService的实例,运行MusicService的onCreate回调方法。onCreate在Service的生命周期中仅仅会调用一次,我们在其onCreate方法中将R.raw.music初始化为媒体播放器,并调用媒体播放器的prepare方法。然后我们将播放器设置为循环播放状态。须要注意的是,在实际生产环境中。我们应该注冊播放器的setOnPreparedListener并调用prepareAsync()方法,为了简化代码起见,我们仅仅调用了播放器的同步方法prepare()。

    调用了onCreate方法后,Android会自己主动回调其onStartCommand方法,事实上每次调用Context的startService都会触发onStartCommand回调方法。所以onStartCommand在Service的生命周期中可能会被调用多次。所以我们在MusicService的onStartCommand中做了推断,推断播放器是否是在播放中,假设当前播放器没有播放我们才调用播放器的start方法播放背景音乐。

    当我们单击了button”播放音乐并退出Activity”之后,MusicService启动起来,播放背景音乐,可是Activity却销毁了,程序的UI界面不见了。

    为了可以停止播放背景音乐,我们须要再次单击应用程序图标,又一次打开MusicActivity。然后单击界面上的”停止播放音乐”button,此时我们会调用Activity的stopService方法,Android Framework接收到要停止服务的intent之后会回调MusicService的onDestroy方法,在该方法中我们停止播放音乐并释放媒体播放器资源。

    本文仅仅是通过播放背景音乐这一简单演示样例演示通过startService启动Service基本使用流程。代码没有进行优化。希望对大家学习Service有所帮助。

  • 相关阅读:
    SpringMVC_day02
    Linux下安装jdk,tomcat,mysql
    SpringMVC_day01
    如何在虚拟机中安装kali linux
    Shell中 &>/dev/null和 >/dev/null 2>&1
    Linux 安全加固2
    linux 安全加固
    记一次修改php.ini不生效的踩坑之旅
    Redis 参数详解
    LAMP + Redis 主从复制
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/6985312.html
Copyright © 2020-2023  润新知