时间:2021-05-20
关于startService的基本使用概述及其生命周期可参见《Android中startService基本使用方法概述》。
本文通过播放背景音乐的简单示例,演示startService的基本使用流程,具体内容如下
系统界面如下:
界面上面就两个按钮,”播放音乐并退出Activity” 和 “停止播放音乐”。我们在该示例中,通过操纵Activity的按钮控制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); } }}当我们单击了按钮”播放音乐并退出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方法播放背景音乐。
当我们单击了按钮”播放音乐并退出Activity”之后,MusicService启动起来,播放背景音乐,但是Activity却销毁了,程序的UI界面不见了。为了能够停止播放背景音乐,我们需要再次单击应用程序图标,重新打开MusicActivity,然后单击界面上的”停止播放音乐”按钮,此时我们会调用Activity的stopService方法,Android Framework接收到要停止服务的intent之后会回调MusicService的onDestroy方法,在该方法中我们停止播放音乐并释放媒体播放器资源。
本文只是通过播放背景音乐这一简单示例演示通过startService启动Service基本使用流程,代码没有进行优化,希望对大家学习Service有所帮助。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
怎样设置qq背景音乐qq背景音乐设置教程 怎样设置qq背景音乐qq背景音乐设置教程怎样设置qq背景音乐qq背景音乐设置教程怎样设置qq背景音乐qq背景音乐设置
花样直播播放背景音乐教程花样直播是一款由深圳市腾讯计算机系统有限公司开发的一款手机直播软件。在花样直播中,背景音乐功能可使用户在语音同时输出本地播放的背景音乐。
在Dreamweaver为网页添加背景音乐播放器,是丰富页面活动的重要内容。本篇教程将就Dreamweaver网页背景音乐播放器的添加进行详细讲解。 1、
在淘宝店加上背景音乐,可以说是淘宝店中美丽的风景线。现在到处都能听到音乐的播放,可以看出音乐在人们心中的位置,淘宝背景音乐也一样。但是,淘宝背景音乐的追加也有很
我们常常需要在放映PPT时,配上背景音乐,又可能同时需要加入讲话的录音等内容,要求背景音乐自动播放的同时,讲话录音也能同时自动播放,怎么实现这样的需求呢?1、打