android 利用Service实现背景音乐的播放
2015-07-03 14:47
260 查看
</pre><pre class="java" name="code">
利用Service实现背景音乐的播放
在android应用程序里,有一种没有UI的类(android.app.Service)——Service。简单来说,Service是一个 background process(背景程序),通过背景程序,可以实现一些不需要UI的功能,比如播放背景音乐。当然,首先要在资源文件夹中添加一首MP3歌曲:
[html]
view plaincopyprint?
<strong>1、Activity类
[java]
</strong> <pre name="code" class="html">package demo.camera;
<strong>1、Activity类 [java] </strong> <pre name="code" class="html">package demo.camera;import android.app.Activity; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.IBinder; import android.view.View;
/** * 演示Activity如何利用Service来完成后台Audio的播放功能 * 同时如何将Service和Activity进行绑定 * @author Administrator * */ public class BackgroundAudioDemo extends Activity { private AudioService audioService; //使用ServiceConnection来监听Service状态的变化 private ServiceConnection conn =
new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { // TODO Auto-generated method stub audioService = null; } @Override public void onServiceConnected(ComponentName name, IBinder binder) { //这里我们实例化audioService,通过binder来实现
audioService = ((AudioService.AudioBinder)binder).getService(); } }; public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.back_audio); } public void onClick(View v){ int id = v.getId(); Intent intent
= new Intent(); intent.setClass(this, AudioService.class); if(id == R.id.btn_start){ //启动Service,然后绑定该Service,这样我们可以在同时销毁该Activity,看看歌曲是否还在播放 startService(intent); bindService(intent, conn, Context.BIND_AUTO_CREATE); finish(); }else if(id == R.id.btn_end){
//结束Service unbindService(conn); stopService(intent); finish(); }else if(id == R.id.btn_fun){ audioService.haveFun(); } } }
[html]
view plaincopyprint?
<strong>新建一个AudioService 类,<span style="font-family: Arial, Helvetica, sans-serif;">AudioService 类</span><span style="font-family: Arial, Helvetica, sans-serif;">继承 android.app.Service,几个有关Service 的重要概念如下:</span>
1. Service 对象以 separated process 的方式执行,这表示 Service 与 UI(Activity)并不在同一个 process 里执行,而是各自在不同的 process 执行。
2. Android应用程序是在 Activity 启动与停止 Service。
3. 重载(override)onStart() 方法(method)在 Service 被启动,执行我们想要的背景功能。
4. 重载 onDestroy() 方法在 Service 被停止时,停止执行中的背景功能。</strong>
<strong>新建一个AudioService 类,<span style="font-family: Arial, Helvetica, sans-serif;">AudioService 类</span><span style="font-family: Arial, Helvetica, sans-serif;">继承 android.app.Service,几个有关Service 的重要概念如下:</span> 1. Service 对象以 separated process 的方式执行,这表示 Service 与 U<pre class="java" name="code">
I(Activity)并不在同一个 process 里执行,而是各自在不同的 process 执行。2. Android应用程序是在 Activity 启动与停止 Service。3. 重载(override)onStart() 方法(method)在 Service 被启动,执行我们想要的背景功能。4. 重载 onDestroy() 方法在 Service 被停止时,停止执行中的背景功能。</strong>
[html]
view plaincopyprint?
<pre name="code" class="html"><strong>2、AudioService类
[java] </strong>
package demo.camera;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Binder;
import android.os.IBinder;
import android.widget.MediaController.MediaPlayerControl;
/**
* 为了可以使得在后台播放音乐,我们需要Service
* Service就是用来在后台完成一些不需要和用户交互的动作
* @author Administrator
*
*/
public class AudioService extends Service implements MediaPlayer.OnCompletionListener{
MediaPlayer player;
private final IBinder binder = new AudioBinder();
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return binder;
}
/**
* 当Audio播放完的时候触发该动作
*/
@Override
public void onCompletion(MediaPlayer player) {
// TODO Auto-generated method stub
stopSelf();//结束了,则结束Service
}
//在这里我们需要实例化MediaPlayer对象
public void onCreate(){
super.onCreate();
//我们从raw文件夹中获取一个应用自带的mp3文件
player = MediaPlayer.create(this, R.raw.eason);
player.setOnCompletionListener(this);
}
/**
</pre></li><li><span> * 该方法在SDK2.0才开始有的,替代原来的onStart方法 </span></li><li class="alt"><span> */ </span></li><li><span> public int onStartCommand(Intent intent, int flags, int startId){ </span></li><li class="alt"><span> if(!player.isPlaying()){ </span></li><li><span> player.start(); </span></li><li class="alt"><span> } </span></li><li><span> return START_STICKY; </span></li><li class="alt"><span> } </span></li><li><span> </span></li><li class="alt"><span> public void onDestroy(){ </span></li><li><span> //super.onDestroy(); </span></li><li class="alt"><span> if(player.isPlaying()){ </span></li><li><span> player.stop(); </span></li><li class="alt"><span> } </span></li><li><span> player.release(); </span></li><li class="alt"><span> } </span></li><li><span> </span></li><li class="alt"><span> //为了和Activity交互,我们需要定义一个Binder对象 </span></li><li><span> class AudioBinder extends Binder{ </span></li><li class="alt"><span> </span></li><li><span> //返回Service对象 </span></li><li class="alt"><span> AudioService getService(){ </span></li><li><span> return AudioService.this; </span></li><li class="alt"><span> } </span></li><li><span> } </span></li><li class="alt"><span> </span></li><li><span> //后退播放进度 </span></li><li class="alt"><span> public void haveFun(){ </span></li><li><span> if(player.isPlaying() && player.getCurrentPosition()</span><span class="tag">></span><span>2500){ </span></li><li class="alt"><span> player.seekTo(player.getCurrentPosition()-2500); </span></li><li><span> } </span></li><li class="alt"><span> } </span></li><li><span>} </span></li></ol></div><pre style="DISPLAY: none" class="html" name="code"><pre name="code" class="html"><strong>2、AudioService类 [java] </strong> package demo.camera; import android.app.Service; import android.content.Intent; import android.media.MediaPlayer; import android.os.Binder; import android.os.IBinder; import android.widget.MediaController.MediaPlayerControl; /** * 为了可以使得在后台播放音乐,我们需要Service * Service就是用来在后台完成一些不需要和用户交互的动作 * @author Administrator * */ public class AudioService extends Service implements MediaPlayer.OnCompletionListener{ MediaPlayer player; private final IBinder binder = new AudioBinder(); @Override public IBinder onBind(Intent arg0) { // TODO Auto-generated method stub return binder; } /** * 当Audio播放完的时候触发该动作 */ @Override public void onCompletion(MediaPlayer player) { // TODO Auto-generated method stub stopSelf();//结束了,则结束Service } //在这里我们需要实例化MediaPlayer对象 public void onCreate(){ super.onCreate(); //我们从raw文件夹中获取一个应用自带的mp3文件 player = MediaPlayer.create(this, R.raw.eason); player.setOnCompletionListener(this); } /** * 该方法在SDK2.0才开始有的,替代原来的onStart方法 */ public int onStartCommand(Intent intent, int flags, int startId){ if(!player.isPlaying()){ player.start(); } return START_STICKY; } public void onDestroy(){ //super.onDestroy(); if(player.isPlaying()){ player.stop(); } player.release(); } //为了和Activity交互,我们需要定义一个Binder对象 class AudioBinder extends Binder{ //返回Service对象 AudioService getService(){ return AudioService.this; } } //后退播放进度 public void haveFun(){ if(player.isPlaying() && player.getCurrentPosition()>2500){ player.seekTo(player.getCurrentPosition()-2500); } } }
[html]
view plaincopyprint?
<pre name="code" class="html">至此,一个完整的服务生成,接下来是在Activity中启动服务。 <strong>修改 AndroidManifest.xml: 在 Package Explorer 视窗里找到目前 Android 项目的资讯描述档,名称为 AndroidManifest.xml。这是一个用來描述 Android 应用程序「整体资讯」的文件,每个 Android 应用程序项目都会有一个。在这里修改 Androidmanifest.xml 的目的是为了「 Android 应用程序加入一个 Service 类别」,这样才有办法驱动 Service。</strong> [html]
<pre name="code" class="html">至此,一个完整的服务生成,接下来是在Activity中启动服务。 <strong>修改 AndroidManifest.xml: 在 Package Explorer 视窗里找到目前 Android 项目的资讯描述档,名称为 AndroidManifest.xml。这是一个用來描述 Android 应用程序「整体资讯」的文件,每个 Android 应用程序项目都会有一个。在这里修改 Androidmanifest.xml 的目的是为了「 Android 应用程序加入一个 Service 类别」,这样才有办法驱动 Service。</strong> [html]
[html]
view plaincopyprint?
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="10" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:name=".WebTestActivity" 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 <pre name="code" class="html"> android:name=".AudioService"
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="10" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:name=".WebTestActivity" 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 <pre name="code" class="html"> android:name=".AudioService"android:exported="true" android:process=":remote"> </service> </application> </manifest>
搜索
相关文章推荐
- Android Exception 17(database or disk is full)
- android屏幕framebuffer绘图
- Android 滑动界面实现---Scroller类别 从源代码和开发文档了解(让你的移动布局)
- android软键盘现实和隐藏的监听
- Android QQ登录验证的小例子
- android 5.2
- Android入门(5)——多状态按钮ToggleButton、多选按钮CheckBox、RadioGroup与RadioButtont按钮
- Android的消息机制
- Android Studio使用OpenCV的配置方法
- android工程里,配置文件的实现。
- Android RGB颜色对照表
- Android WebService
- android之AlertDialog 点击其他区域自动消失
- android之AlertDialog 点击其他区域自动消失
- android之AlertDialog 点击其他区域自动消失
- android之AlertDialog 点击其他区域自动消失
- Android Home and back
- 我的Android Studio 优化之路
- Android下常见的内存泄露
- Android 大约Dialog弹出窗口