23 广播服务结合音乐Demo5
MainActivity.java
package com.dmy.demo5;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
public class MainActivity extends Activity {
private TextView time;
private SeekBar seekBar;
private Button play;
private Button stop;
private BroadcastReceiver receiver;
boolean onTouch =false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化控件
init();
}
private void init() {
time = (TextView) findViewById(R.id.time);
seekBar = (SeekBar) findViewById(R.id.seek_bar);
play = (Button) findViewById(R.id.play);
stop = (Button) findViewById(R.id.stop);
//为进度条设置监听
seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
//用户停止进度条操作
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
Intent intent = new Intent();
intent.setAction(com.dmy.demo5.Menu.SERVER_INTENT);
//flase意义表示播放音乐 true为暂停
intent.putExtra(com.dmy.demo5.Menu.IS_PAUSE, false);
intent.putExtra(Menu.POS, seekBar.getProgress());
sendBroadcast(intent);
onTouch=false;
}
//用户手指点击点击
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
//给服务发送一个暂停状态过去
Intent intent = new Intent();
intent.setAction(com.dmy.demo5.Menu.SERVER_INTENT);
intent.putExtra(com.dmy.demo5.Menu.IS_PAUSE, true);
//-1表示不改变当前进度
intent.putExtra(com.dmy.demo5.Menu.POS, -1);
onTouch = true;
sendBroadcast(intent);
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
}
});
receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// 音乐的总长度
int total = intent.getIntExtra(com.dmy.demo5.Menu.TOTAL, 0);
// 音乐当前位置
int pos = intent.getIntExtra(com.dmy.demo5.Menu.POS, 0);
// 音乐总分钟
int totalM = total / 1000 / 60;
// 音乐总分钟剩余秒
int totalS = total / 1000 % 60;
// 音乐当前分钟
int posM = pos / 1000 / 60;
// 音乐总分钟剩余秒
int posS = pos / 1000 % 60;
StringBuilder sb = new StringBuilder();
sb.append(posM / 10)
.append(posM % 10)
.append(":")
.append(posS / 10)
.append(posS % 10)
.append("/")
.append(totalM / 10).append(totalM % 10).append(":").append(totalS / 10).append(totalS % 10);
time.setText(sb);
seekBar.setMax(total);
if (!onTouch) {
seekBar.setProgress(pos);
}
}
};
Intent intent = new Intent("com.dmy.demo5.MyServer");
// 6.0需要写上包
intent.setPackage(getPackageName());
// 开启服务
startService(intent);
//注册广播
IntentFilter filter = new IntentFilter();
filter.addAction(com.dmy.demo5.Menu.UI_INTENT);
registerReceiver(receiver, filter);
}
public void play(View v) {
boolean flag = false;
// 如果当前按钮的内容是暂停则返回true
flag = "暂停".equals(play.getText());
// 给按钮设置新的文字
String newFlag = flag ? "播放" : "暂停";
play.setText(newFlag);
Intent intent = new Intent();
intent.setAction(com.dmy.demo5.Menu.SERVER_INTENT);
intent.putExtra(com.dmy.demo5.Menu.IS_PAUSE, flag);
//-1表示不改变当前进度
intent.putExtra(com.dmy.demo5.Menu.POS, -1);
sendBroadcast(intent);
}
public void stop(View v) {
}
}
Menu.java
package com.dmy.demo5;
public class Menu {
// 在itent中传入值 boolean如果为true是暂停状态的按钮
public static final String IS_PAUSE = "isPause";
// 判断是否按下停止状态
public static final String IS_STOP = "is_stop";
// 音乐当前位置
public static final String POS = "pos";
// 发送服务广播的意图
public static final String SERVER_INTENT = "updata.music.server";
// 发送UI界面广播的意图
public static final String UI_INTENT = "updata.music.ui";
// 音乐总时长
public static final String TOTAL = "total";
}
MyServer.java
package com.dmy.demo5;
import java.io.IOException;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.MediaPlayer;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
public class MyServer extends Service {
private MediaPlayer mp;
int pos = 0;
// 用于接收音乐播放时用户点击按钮和拉动滚动条
private BroadcastReceiver stateReceiver;
boolean flagStop = false;
@Override
public void onCreate() {
super.onCreate();
mp = MediaPlayer.create(getApplicationContext(), R.raw.wlxq);
// 初始化广播接受者
initBroadCast();
// 初始化线程不断发送消息 改变UI
initThread();
}
// 初始化线程不断发送消息 改变UI
public void initThread() {
new Thread() {
public void run() {
while (true) {
Intent intent = new Intent(Menu.UI_INTENT);
if (mp != null) {
intent.putExtra(Menu.TOTAL, mp.getDuration());
intent.putExtra(Menu.POS, mp.getCurrentPosition());
}
if (!flagStop) {
sendBroadcast(intent);
}
try {
sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
}.start();
}
private void initBroadCast() {
stateReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// 如果为true 现在的状态是用户点击了了暂停按钮
Boolean is_pause = intent.getBooleanExtra(Menu.IS_PAUSE, false);
if (is_pause && mp != null) {
mp.pause();
} else if (mp != null) {
pos = intent.getIntExtra(Menu.POS, -1);
mp.seekTo(pos);
// 否则用户点了播放按钮
mp.start();
}
}
};
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// 注册广播接受者
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("updata.music.server");
registerReceiver(stateReceiver, intentFilter);
Log.e("fmy", "onStartCommand");
return START_NOT_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
return new MyBinder();
}
class MyBinder extends Binder {
public MyServer getServer() {
return MyServer.this;
}
}
}
清单文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.dmy.demo5"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="16"
android:targetSdkVersion="21" />
<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.dmy.demo5.MyServer">
<intent-filter>
<action android:name="com.dmy.demo5.MyServer"></action>
</intent-filter>
</service>
</application>
</manifest>
23 广播服务结合音乐Demo5的更多相关文章
- Openfire开发广播服务接口,支持离线广播消息
Openfire开发广播服务接口,支持离线广播消息 概要 最近公司要求做一个web端向所有移动端发送公告,所以考虑到即时性就用openfire做服务.不过为了减轻web端的工作量,我们开发一个简单的插 ...
- CentOS 7下MySQL5.7.23的服务配置参数测试
CentOS 7默认安装MySQL5.7.23,服务管理发生了变化,从sysvinit(service mysql start)变化为systemd(systemctl start mysqld.se ...
- 2-3 sshd服务---暴力破解应对策略
sshd服务暴力破解步骤 sshd暴力破解方法 防止暴力破解调优 1. 变更默认端口 2. 变更root用户 3. 日志监控-->防止暴力破解(fail2ban应用) fail2ban详解 ...
- vlc 播放器的点播和广播服务
vlc 是一个开源的,同时跨平台的播放器.在研究 rtsp 协议时发现,它同时还是一个强大的流媒体服务器 VLM VLM(VideoLAN Manager) 在 vlc 中是一个小型的媒体管理器,它能 ...
- Android应用开发基础之八:广播与服务(二)
服务两种启动方式 startService:服务被启动之后,跟启动它的组件没有一毛钱关系 bindService:跟启动它的组件同生共死 绑定服务和解绑服务的生命周期方法:onCreate->o ...
- Android开发学习—— Service 服务
Service运行于后台的一个组件,用来运行适合运行在后台的代码,服务是没有前台界面,可以视为没有界面的activity. 服务可以被手动关闭,不会重启,但是如果被自动关闭,内存充足就会重启. sta ...
- iOS开发——高级技术&蓝牙服务
蓝牙服务 蓝牙 随着蓝牙低功耗技术BLE(Bluetooth Low Energy)的发展,蓝牙技术正在一步步成熟,如今的大部分移动设备都配备有蓝牙4.0,相比之前的蓝牙技术耗电量大大降低.从iOS的 ...
- Linux多线程服务端编程:使用muduo C++网络库
内容推荐本 书主要讲述采用现代C++在x86-64 Linux上编写多线程TCP网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread.这 ...
- Android服务——Service
服务 Service 是一个可以在后台执行长时间运行操作而不使用用户界面的应用组件.服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行. 此外,组件可以绑定到服务,以与之进行 ...
随机推荐
- javaIO流实现文件拷贝
package com.java.demo; import java.io.*; public class CopyDemo { public static void main(String[] ar ...
- scrapy爬取数据进行数据库存储和本地存储
今天记录下scrapy将数据存储到本地和数据库中,不是不会写,因为小编每次都写觉得都一样,所以记录下,以后直接用就可以了-^o^- 1.本地存储 设置pipel ines.py class Ak17P ...
- [自用]多项式类数学相关(定理&证明&板子)
写在前面 由于上一篇总结的版面限制,特开此文来记录 \(OI\) 中多项式类数学相关的问题. 该文启发于Miskcoo的博客,甚至一些地方直接引用,在此特别说明:若文章中出现错误,烦请告知. 感谢你的 ...
- [HDU]4694 Important Sisters(支配树)
支配树模板 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ...
- 【HDU 2669】Romantic
Problem Description The Sky is Sprite.The Birds is Fly in the Sky.The Wind is Wonderful.Blew Throw t ...
- ●BZOJ 1853 [Scoi2010]幸运数字
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1853 题解: 容斥原理,暴力搜索,剪枝(这剪枝剪得真玄学) 首先容易发现,幸运号码不超过 2 ...
- 两道很好的dp题目【4.29考试】
A 问题描述: 对于一个排列,考虑相邻的两个元素,如果后面一个比前面一个大,表示这个位置是上升的,用I表示,反之这个位置是下降的,用D表示.如排列3,1,2,7,4,6,5可以表示为DIIDID. 现 ...
- java 之 MyBatis(sql 可以执行,在eclipse执行报错问题)
前段时间写 mybatis Sql 查询语句的时候,发现一个很奇怪的现象,我写的SQL 语句在 pl/Sql 中明明可以执行,但是放到 eclipse 中执行却报错,因为时间比较久,依稀记得是文字与字 ...
- 机器学习基础—集成学习Bagging 和 Boosting
集成学习 就是不断的通过数据子集形成新的规则,然后将这些规则合并.bagging和boosting都属于集成学习.集成学习的核心思想是通过训练形成多个分类器,然后将这些分类器进行组合. 所以归结为(1 ...
- VC++ 6.0中添加库文件和头文件
附加头文件包含 VC6.0中: VC6.0默认include包含路径:Tools>Options>Directories>Include files. 对于特定项目的头文件包含,在& ...