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 是一个可以在后台执行长时间运行操作而不使用用户界面的应用组件.服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行. 此外,组件可以绑定到服务,以与之进行 ...
随机推荐
- [LeetCode] Valid Palindrome II 验证回文字符串之二
Given a non-empty string s, you may delete at most one character. Judge whether you can make it a pa ...
- jdk1.7中的常量池
在探究jdk1.7中的常量池,我们可以先看看以下的这段代码 public static void main(String[] args) throws Throwable { List<Stri ...
- Javasript设计模式之链式调用
写过jquery的可能都知道,jquery里面可以很方便的使用以下代码: // 不使用链式调用 const element = $(ele); element.addClass('red'); ele ...
- 【NOIP2009】Hankson 的趣味题
题目描述 Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫 Hankson.现在,刚刚放学回家的 Hankson 正在思考一个有趣的问题. 今天在课堂上,老师讲解 ...
- Evensgn 捡树枝
问题 A: Evensgn 剪树枝 时间限制: 1 Sec 内存限制: 128 MB 题目描述 繁华中学有一棵苹果树.苹果树有 n 个节点(也就是苹果),n − 1 条边(也就 是树枝).调皮的 E ...
- UpdateAfterEvent
10月3日,在杭州市西湖景区,一只小松鼠不停地接受一道道食物,花生.玉米.饼干,可谓来者不拒,憨态可掬的模样吸引了众多围观者...Description 小松鼠打了10个小时的游戏,一脸满足.却发 ...
- UVA 11584 划分回文字串
将其划分为尽可能少的回文串 dp[i] = min(dp[i],dp[j] + 1) 来表示j+1~i是回文串 #include <iostream> #include <cs ...
- 12563 Jin Ge Jin Qu hao
• Don’t sing a song more than once (including Jin Ge Jin Qu). • For each song of length t, either si ...
- Python Django系统
本节内容 路由系统,视图函数,模板引擎,ORM操作 FBV和CBV ORM操作补充 Cookie和Session Ajax入门 1. Django基本内容整理 1.1 路由系统 Django中路由系 ...
- js延迟函数
正确写法: setTimeout(function (){ alert("delay!"); },5000); 错误写法: setTimeout( alert("dela ...