Android简单音乐播放实例
作者:cjjky 发布时间:2023-04-13 05:49:55
Service翻译成中文是服务,熟悉Windows 系统的同学一定很熟悉了。Android里的Service跟Windows里的Service功能差不多,就是一个不可见的进程在后台执行。
Android中的服务,它与Activity不同,它是不能与用户交互的,不能自己启动的,运行在后台的程序,如果我们退出应用时,Service进程并没有结束,它仍然在后台运行,例如我们打开一个音乐播放器来听音乐,在听音乐的同时也想做下其它的事情,比如上网聊Q、或者上网浏览新闻之类的事情。这样的话,我们就需要用到Service服务了。下面我们以一个简单的音乐播放器的实例来说明下Service的生命周期和Service的使用。
下面是音乐播放器Demo的程序结构图:
Android Service的生命周期:
Android中Service的生命周期并不是很复杂,只是继承了onCreate(), onStart(), onDestory()三个方法。当我们第一次启动Service服务时,调用onCreate() --> onStart()两个方法,当停止Service服务时,调用onDestory()方法。如果Service已经启动了,第二次再启动同一个服务时,就只是调用 onStart() 这个方法了。
Android Service 的使用:
1、参照上面的程序结构图,我们可以创建一个Android程序,在src目录下创建一个Activity,一个继承自Service类的服务类;同时在资源文件夹res目录下创建一个raw的文件夹存放音频文件,如把music.mp3音乐文件放在该目录下。该程序的主界面如下:
2、layout目录下的main.xml文件的源码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Welcome to Andy's blog!"
android:textSize="16sp"/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="音乐播放服务"/>
<Button
android:id="@+id/startMusic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="开启音乐播放服务"/>
<Button
android:id="@+id/stopMusic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="停止音乐播放服务"/>
<Button
android:id="@+id/bindMusic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="绑定音乐播放服务"/>
<Button
android:id="@+id/unbindMusic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="解除 ——绑定音乐播放服务"/>
</LinearLayout>
3、src目录下MusicService.java源码:
package com.andyidea.service;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;
public class MusicService extends Service {
//为日志工具设置标签
private static String TAG = "MusicService";
//定义音乐播放器变量
private MediaPlayer mPlayer;
//该服务不存在需要被创建时被调用,不管startService()还是bindService()都会启动时调用该方法
@Override
public void onCreate() {
Toast.makeText(this, "MusicSevice onCreate()"
, Toast.LENGTH_SHORT).show();
Log.e(TAG, "MusicSerice onCreate()");
mPlayer = MediaPlayer.create(getApplicationContext(), R.raw.music);
//设置可以重复播放
mPlayer.setLooping(true);
super.onCreate();
}
@Override
public void onStart(Intent intent, int startId) {
Toast.makeText(this, "MusicSevice onStart()"
, Toast.LENGTH_SHORT).show();
Log.e(TAG, "MusicSerice onStart()");
mPlayer.start();
super.onStart(intent, startId);
}
@Override
public void onDestroy() {
Toast.makeText(this, "MusicSevice onDestroy()"
, Toast.LENGTH_SHORT).show();
Log.e(TAG, "MusicSerice onDestroy()");
mPlayer.stop();
super.onDestroy();
}
//其他对象通过bindService 方法通知该Service时该方法被调用
@Override
public IBinder onBind(Intent intent) {
Toast.makeText(this, "MusicSevice onBind()"
, Toast.LENGTH_SHORT).show();
Log.e(TAG, "MusicSerice onBind()");
mPlayer.start();
return null;
}
//其它对象通过unbindService方法通知该Service时该方法被调用
@Override
public boolean onUnbind(Intent intent) {
Toast.makeText(this, "MusicSevice onUnbind()"
, Toast.LENGTH_SHORT).show();
Log.e(TAG, "MusicSerice onUnbind()");
mPlayer.stop();
return super.onUnbind(intent);
}
}
4、src目录下MusicServiceActivity源码:
package com.andyidea.service;
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.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class MusicServiceActivity extends Activity {
//为日志工具设置标签
private static String TAG = "MusicService";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//输出Toast消息和日志记录
Toast.makeText(this, "MusicServiceActivity",
Toast.LENGTH_SHORT).show();
Log.e(TAG, "MusicServiceActivity");
initlizeViews();
}
private void initlizeViews(){
Button btnStart = (Button)findViewById(R.id.startMusic);
Button btnStop = (Button)findViewById(R.id.stopMusic);
Button btnBind = (Button)findViewById(R.id.bindMusic);
Button btnUnbind = (Button)findViewById(R.id.unbindMusic);
//定义点击 *
OnClickListener ocl = new OnClickListener() {
@Override
public void onClick(View v) {
//显示指定 intent所指的对象是个 service
Intent intent = new Intent(MusicServiceActivity.this,MusicService.class);
switch(v.getId()){
case R.id.startMusic:
//开始服务
startService(intent);
break;
case R.id.stopMusic:
//停止服务
stopService(intent);
break;
case R.id.bindMusic:
//绑定服务
bindService(intent, conn, Context.BIND_AUTO_CREATE);
break;
case R.id.unbindMusic:
//解绑服务
unbindService(conn);
break;
}
}
};
//绑定点击监听
btnStart.setOnClickListener(ocl);
btnStop.setOnClickListener(ocl);
btnBind.setOnClickListener(ocl);
btnUnbind.setOnClickListener(ocl);
}
//定义服务链接对象
final ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
Toast.makeText(MusicServiceActivity.this, "MusicServiceActivity onSeviceDisconnected"
, Toast.LENGTH_SHORT).show();
Log.e(TAG, "MusicServiceActivity onSeviceDisconnected");
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Toast.makeText(MusicServiceActivity.this, "MusicServiceActivity onServiceConnected"
,Toast.LENGTH_SHORT).show();
Log.e(TAG, "MusicServiceActivity onServiceConnected");
}
};
}
5、最后,我们别忘了在AndroidManifest.xml配置文件中添加对Service的注册。即在application节点中添加<service android:name=".MusicService"/> 进行注册。
6、我们来看下程序运行后的Log.e中显示的Service生命周期
7、我们在Android终端设备中查看下刚才启动的音乐播放服务,看看我们退出程序后,是不是该程序的服务还在运行的呢?按如下步骤:Menu --> Settings --> Applications --> Running services 。在弹出的 Running services 中可以看到有哪些服务在运行。
这样我们就看到我们退出程序后,是由于该服务还在后台运行着,所以我们的音乐还可以继续播放着。就这样,我们就可以一边享受音乐,一边可以聊QQ,或者浏览新闻等等。


猜你喜欢
- 1. AIE (演示地址)AIE是一个开源的ajax图片编辑器,基于ExtJS与PHP ImageMagick开发,易于与博客/相册等其它应
- 在游戏开发中,主角需要通过跑地图来通关升级,本章主要介绍主角的移动和摄像跟随的操作。主角移动角色位移通过主角的骨骼动画控制(后续文章会详细介
- 今天来了一个问题:软键盘无法弹出。分析后是因为系统判断当前有外接硬键盘,就会隐藏软键盘。但实际情况并不是这么简单,该问题只有在特定条件下偶现
- 最近在维护项目,app遇到安装在高版本的Android时,以往直接授权和new File(path)的形式不再支持,日志也是说Permiss
- springboot整合mybatis实现数据库更新批处理1.在mapper接口中编写方法/** * 修改book表中的销量和库存
- 开始我用List<泛型>接受json串,如下,结果list内并非泛型对象,而是JSONObject对象。这样在遍历的时候就报了转
- 本文实例为大家分享了Unity实现文本转贴图的具体代码,供大家参考,具体内容如下导入字体导入ttf字体,修改Character为Custom
- 项目介绍java 开发中,参数校验是非常常见的需求。但是 hibernate-validator 在使用过程中,依然会存在一些问题。vali
- hystrix参数使用方法通过注解@HystrixCommand的commandProperties去配置,如下就是hystrix命令超时时
- 使用idea创建javaweb项目idea还是写框架项目比较爽,原生的javaweb项目不是特别方便,这篇文章就是记录一下创建的过程图较多注
- 本文实例讲述了C#实现简单的RSA非对称加密算法。分享给大家供大家参考,具体如下:界面控件namespace RSA算法{ pa
- 首先倒入一个依赖: compile 'com.youth.banner:banner:1.4.9'添加的权限:<use
- 最近这学期做了一个java迷宫的课程设计,这里代码及其算法逻辑就分享出来。首先简单的说一下其中我使用的算法(自动生成地图:递归分割法、递归回
- //去title requestWindowFeature(Window.FEATURE_NO_TITLE); //隐藏状态栏 getWin
- 简介使用 SpringBoot 配置 FTP 服务器,上传、删除、下载文件。配置 FTP检查是否安装 vsftpdrpm -qa | gre
- Radiobutton是一种单选按钮,是由于RadioGroup管理下的一组按钮,所以一旦其中的一个button选中,再点击,就不能取消,想
- TabLayout+ViewPager实现tab和页面联动效果xml中:<?xml version="1.0" e
- 模板方法-基类封装Activity和Fragment应该是Android最常用的组件,对他进行简单的封装对提高代码的简洁性也有很大的帮助。B
- RecyclerView目前来说对大家可能不陌生了。由于在公司的项目中,我们一直用的listview和gridview。某天产品设计仿照美团
- hibernate一级缓存和二级缓存的区别缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用