1.我们播放音乐,希望在后台长期运行,不希望因为内存不足等等原因,从而导致被gc回收,音乐播放终止,所以我们这里使用服务Service创建一个音乐播放器。

2.创建一个音乐播放器项目(使用服务)

(1)首先新建一个Android项目,命名为"Mp3音乐播放器",如下:

(2)创建服务MusicService,如下:

 package com.himi.Mp3player;

 import android.app.Service;
import android.content.Intent;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Binder;
import android.os.IBinder; public class MusicService extends Service {
/**
* 要播放的音乐文件的路径
*/
private String path;
private MediaPlayer mediaPlayer;
/**
* 音乐播放的状态
*/
private int PLAYING_STATUS;
private int STOP = 0;
private int PLAYING = 1;
private int PAUSE = 2; @Override
public IBinder onBind(Intent intent) {
return new MyBinder();
} private class MyBinder extends Binder implements IMusicService {
public MusicService callGetMusicService() {
return getMusicService();
}
} /**
* 返回服务的对象
*
* @return
*/
public MusicService getMusicService() {
return this;
} @Override
public void onCreate() {
System.out.println("服务被创建了。");
super.onCreate();
} @Override
public void onDestroy() {
System.out.println("服务被销毁了。");
super.onDestroy();
} /**
* 设置要播放的音乐
*
* @param path
* 音乐文件的路径
*/
public void setMusic(String path) {
this.path = path;
} /**
* 播放音乐,播放之前请设置音乐的路径
*/
public boolean play() {
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
mediaPlayer.stop();
mediaPlayer.release();
mediaPlayer = null;
}
try {
if (path == null) {
return false;
}
mediaPlayer = new MediaPlayer();
mediaPlayer.reset();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(path);
mediaPlayer.prepare();
mediaPlayer.start();
PLAYING_STATUS = PLAYING;
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
} /**
* 暂停音乐
*/
public void pause() {
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
mediaPlayer.pause();
PLAYING_STATUS = PAUSE;
}
} /**
* 继续开始
*/
public void resume() {
if (mediaPlayer != null && PLAYING_STATUS == PAUSE) {
mediaPlayer.start();
PLAYING_STATUS = PLAYING;
}
} public void stop() {
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
mediaPlayer.stop();
mediaPlayer.release();
mediaPlayer = null;
PLAYING_STATUS = STOP;
}
}
}

使用到的接口为IMusicService,如下:

这里服务(service)方法比较多,所以我们最好调用方法获取服务的引用,如下:

 package com.himi.Mp3player;

 public interface IMusicService {
//调用获取服务的引用
public MusicService callGetMusicService(); }

(3)布局文件activity_main.xml,如下:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.himi.Mp3player.MainActivity" > <EditText
android:id="@+id/et_path"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入音乐的路径" /> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" > <Button
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="play"
android:text="播放" /> <Button
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="pause"
android:text="暂停" /> <Button
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="resume"
android:text="继续" /> <Button
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="stop"
android:text="停止" />
</LinearLayout> </LinearLayout>

布局效果如下:

(4)使用到服务要在AndroidMainfest.xml文件中注册服务,如下:

 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.himi.Mp3player"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk
android:minSdkVersion="15"
android:targetSdkVersion="17" /> <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name="com.himi.Mp3player.MusicService"></service>
</application> </manifest>

 (5)此处的MainActivity,如下:

 package com.himi.Mp3player;

 import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast; public class MainActivity extends Activity { private MyConn conn;
private IMusicService iMusicService;
private MusicService musicService;
private EditText et_path; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); et_path = (EditText) findViewById(R.id.et_path);
// 保证服务长期后台运行
Intent intent = new Intent(this, MusicService.class);
startService(intent);
// 调用服务的方法
conn = new MyConn();
bindService(intent, new MyConn(), BIND_AUTO_CREATE);
} private class MyConn implements ServiceConnection { public void onServiceConnected(ComponentName name, IBinder service) {
iMusicService = (IMusicService) service;
musicService = iMusicService.callGetMusicService();
} public void onServiceDisconnected(ComponentName name) {
// TODO 自动生成的方法存根 } } public void play(View view) {
String path = et_path.getContext().toString().trim();
if (TextUtils.isEmpty(path)) {
Toast.makeText(this, "路径不合法", 0).show();
return;
}
musicService.setMusic(path);
boolean result = musicService.play();
if (!result) {
Toast.makeText(this, "播放失败,请检查路径,或者音乐文件是否合法", 0).show();
}
} public void pause(View view) {
musicService.pause();
} public void resume(View view) {
musicService.resume(); } public void stop(View view) {
musicService.stop();
} @Override
protected void onDestroy() {
// 解绑服务
unbindService(conn);
super.onDestroy();
} }

Android(java)学习笔记177: 服务(service)之音乐播放器的更多相关文章

  1. Android开发学习之路--MediaPlayer之简单音乐播放器初体验

    很多时候我们都会用手机来播放音乐,播放视频,那么具体地要怎么实现呢,其实主要是MediaPlayer类来完成的.下面通过简单的例子来实现一首歌曲的播放吧.新建工程MediaPlayerStudy,这里 ...

  2. Android 音视频深入 十三 OpenSL ES 制作音乐播放器,能暂停和调整音量(附源码下载)

    项目地址https://github.com/979451341/OpenSLAudio OpenSL ES 是基于NDK也就是c语言的底层开发音频的公开API,通过使用它能够做到标准化, 高性能,低 ...

  3. Android学习笔记_23_服务Service之AIDL和远程服务实现进程通信以及进程间传递自定义类型参数

    一.了解AIDL语言: 在Android中, 每个应用程序都有自己的进程,当需要在不同的进程之间传递对象时,该如何实现呢? 显然, Java中是不支持跨进程内存共享的.因此要传递对象, 需要把对象解析 ...

  4. BroadcastReceiver的实例----基于Service的音乐播放器之一

    下面的程序开发了一个基于Service的音乐盒,程序的音乐将会由后台运行的Service组件负责播放,当后台的播放状态发生改变时,程序将会通过发送广播通知前台Activity更新界面:当用户单击前台A ...

  5. Android学习笔记_22_服务Service应用之—与Activity进行相互通信的本地服务

    一.启动服务的两种方法方法: 第一种:  startService()和stopService()启动关闭服务.适用于服务和Activity之间没有调用交互的情况.如果相互之间需要方法调用或者传递参数 ...

  6. 【大结局】《从案例中学习JavaScript》之酷炫音乐播放器(四)

    这是之前写的用H5制作的音乐播放器,前三节其实已经做得差不多了,音轨的制作原理已经在上一节说明,不过一直还没有和音乐对接. 本章作为该系列的一个完结篇,我会专门把动态音轨的实现代码贴出来,demo地址 ...

  7. android 音乐播放器

    本章以音乐播放器为载体,介绍android开发中,通知模式Notification应用.主要涉及知识点Notification,seekbar,service. 1.功能需求 完善音乐播放器 有播放列 ...

  8. Android音乐播放器的设计与实现

    目录 应用开发技术及开发平台介绍 应用需求分析 应用功能设计及其描述 应用UI展示 一.应用开发技术及平台介绍 ①开发技术: 本系统是采用面向对象的软件开发方法,基于Android studio开发平 ...

  9. Android(java)学习笔记234: 服务(service)之音乐播放器

    1.我们播放音乐,希望在后台长期运行,不希望因为内存不足等等原因,从而导致被gc回收,音乐播放终止,所以我们这里使用服务Service创建一个音乐播放器. 2.创建一个音乐播放器项目(使用服务) (1 ...

随机推荐

  1. I.MX6 lcd lvds 注册流程

    /************************************************************************ * I.MX6 lcd lvds 注册流程 * 说明 ...

  2. BZOJ_2251_[2010Beijing Wc]外星联络_后缀数组

    BZOJ_2251_[2010Beijing Wc]外星联络_后缀数组 Description 小 P 在看过电影<超时空接触>(Contact)之后被深深的打动,决心致力于寻 找外星人的 ...

  3. 【HDU 1754】 I Hate It

    [题目链接] 点击打开链接 [算法] 树状数组的最值查询 详见这篇文章 : https://blog.csdn.net/u010598215/article/details/48206959 [代码] ...

  4. 【Codeforces 776B】Sherlock and his girlfriend

    [题目链接] 点击打开链接 [算法] 将所有质数染成1,合数染成2即可 [代码] #include<bits/stdc++.h> using namespace std; #define ...

  5. flex兼容新

    /* 子元素-平均分栏 */.flex1 { -webkit-box-flex: 1; /* OLD - iOS 6-, Safari 3.1-6 */ -moz-box-flex: 1; /* OL ...

  6. BestCoder Round #74 (div.1) 1002Shortest Path(hdoj5636)

    哈哈哈哈,我就知道这道题目再扔给我,我还是不会,就是这么菜,哈哈哈 一开始官方题解就没搞懂-然后就看了一下别人的代码,水水过就算了.今天拿到-GG: 题意: 一开始,有一张原图,有一条长度为n的链. ...

  7. PTA QQ Account Manageme【map的巧妙应有】

    5-27 QQ Account Management (25分) You are supposed to implement the functions of account "Log in ...

  8. MySQL 使用 MySQLDump 复制数据库

    1.导出整个数据库  mysqldump -u 用户名 -p 数据库名 > 导出的文件名      mysqldump -u wcnc -p smgp_apps_wcnc > wcnc.s ...

  9. bzoj 3771: Triple【生成函数+FFT+容斥原理】

    瞎搞居然1A,真是吃鲸 n的范围只有聪明人能看见--建议读题3遍 首先看计数就想到生成函数,列出多项式A(x),然后分别考虑123 对于选一个的直接计数即可: 对于选两个的,\( A(x)^2 \), ...

  10. PAT 1035 插入与归并(25)

    原题:https://pintia.cn/problem-sets/994805260223102976/problems/994805286714327040传送门: 根据维基百科的定义: 插入排序 ...