当前位置: 首页 > news >正文

android四大组件之Service 简单音乐播放器

如果要从service里向activity里发消息,要把handle定义为static这样不管在那里都能获取到了。

private void addTime(){
        Timer timer = new Timer();
        //放在计时器里是为了不断的获取进度
        timer.schedule(new TimerTask() {
            
            @Override
            public void run() {
                //总长度
                int du = mediaPlayer.getDuration();
                //当前进度
                int oo = mediaPlayer.getCurrentPosition();
                Message msg = MainActivity.handler.obtainMessage();
                Bundle bundle = new Bundle();
                bundle.putInt("du",du);
                bundle.putInt("oo",oo);
                msg.setData(bundle);
                MainActivity.handler.sendMessage(msg);
                
            }
            //延迟,更新时间
        }, 5, 500);
        
    }

这里用到了这个计时器类,主要功能就是让这个每个多少秒刷新一次

package com.example.musicplay;

public interface PlayInterface {
    void play();
    void playContiue();
    void pause();
    //设置音乐播放的时间
    void seekTo(int pross);
}
package com.example.musicplay;


import java.util.Timer;
import java.util.TimerTask;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnPreparedListener;
import android.os.Binder;
import android.os.Bundle;
import android.os.IBinder;
import android.os.Message;

public class PlayService extends Service {
    private MediaPlayer mediaPlayer;
    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        return new MusicBinder();
    }
    class MusicBinder extends Binder implements PlayInterface{

        @Override
        public void play() {
            // TODO Auto-generated method stub
            PlayService.this.play();
        }

        @Override
        public void playContiue() {
            // TODO Auto-generated method stub
            PlayService.this.playContiue();
        }

        @Override
        public void pause() {
            // TODO Auto-generated method stub
            PlayService.this.pause();
            
        }

        @Override
        public void seekTo(int pross) {
            // TODO Auto-generated method stub
            PlayService.this.seekTo(pross);
        }
        
    }
    @Override
    public void onCreate() {
        mediaPlayer = new MediaPlayer();
    }
    
    private void play(){
        //重置
        mediaPlayer.reset();
        try {
            mediaPlayer.setDataSource("sdcard/Charlotte Perrelli - Hero.mp3");
            //准备
            mediaPlayer.prepare();
        } catch (Exception e) {
            // TODO Auto-generated catcssh block
            e.printStackTrace();
        }
        mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
            //准备完毕此方法调用
            @Override
            public void onPrepared(MediaPlayer arg0) {
                // TODO Auto-generated method stub
                mediaPlayer.start();
                addTime();
            }
        });
    }
    private void playContiue(){
        mediaPlayer.start();
    }
    private void pause(){
        mediaPlayer.pause();
    }
    //用seekbar设置音乐的时间
    private void seekTo(int pross){
        mediaPlayer.seekTo(pross);
    }
    private void addTime(){
        Timer timer = new Timer();
        //放在计时器里是为了不断的获取进度
        timer.schedule(new TimerTask() {
            
            @Override
            public void run() {
                //总长度
                int du = mediaPlayer.getDuration();
                //当前进度
                int oo = mediaPlayer.getCurrentPosition();
                Message msg = MainActivity.handler.obtainMessage();
                Bundle bundle = new Bundle();
                bundle.putInt("du",du);
                bundle.putInt("oo",oo);
                msg.setData(bundle);
                MainActivity.handler.sendMessage(msg);
                
            }
            //延迟,更新时间
        }, 5, 500);
        
    }
}
package com.example.musicplay;

import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.SeekBar.OnSeekBarChangeListener;

public class MainActivity extends Activity {
    private PlayInterface p;
    static Handler handler = new Handler() {
        public void handleMessage(android.os.Message msg) {
            Bundle bundle = msg.getData();
            int du = bundle.getInt("du");
            int oo = bundle.getInt("oo");
            sb.setMax(du);
            sb.setProgress(oo);
            int mmm = sb.getProgress() / 1000;
            int min = mmm / 60;
            int mm = mmm % 60;
            if (min == 0) {

                show.setText("" + mm);
            } else {
                show.setText(min + ":" + mm);
            }
        };
    };
    private static SeekBar sb;
    private static TextView show;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        sb = (SeekBar) findViewById(R.id.sb);
        show = (TextView) findViewById(R.id.show);
        Intent intent = new Intent(this, PlayService.class);
        startService(intent);
        bindService(intent, new Conn(), BIND_AUTO_CREATE);
        sb.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

            @Override
            public void onStopTrackingTouch(SeekBar seekbar) {
                // TODO Auto-generated method stub
                p.seekTo(seekbar.getProgress());
            }

            @Override
            public void onStartTrackingTouch(SeekBar arg0) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {
                // TODO Auto-generated method stub

            }
        });

        findViewById(R.id.paly).setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                p.play();

            }
        });
        findViewById(R.id.contiue).setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                p.playContiue();

            }
        });
        findViewById(R.id.pause).setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                p.pause();
            }
        });
    }

    class Conn implements ServiceConnection {

        @Override
        public void onServiceConnected(ComponentName arg0, IBinder arg1) {
            // TODO Auto-generated method stub
            p = (PlayInterface) arg1;
        }

        @Override
        public void onServiceDisconnected(ComponentName arg0) {
            // TODO Auto-generated method stub

        }

    }

}
<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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <Button
        android:id="@+id/paly"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="开始播放" />

    <Button
        android:id="@+id/contiue"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="继续播放" />

    <Button
        android:id="@+id/pause"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="暂停播放" />

    <SeekBar
        android:id="@+id/sb"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/show"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

 

转载于:https://www.cnblogs.com/84126858jmz/p/4979068.html

相关文章:

  • 已安装pymysql 但Pycharm 中import pymysql出错的解决方案
  • 关于字符串的倒置
  • 实时计算Flink——独享模式——Batch功能介绍
  • jQuery页面加载初始化的3种方法
  • MetaMask/provider-engine-1
  • canvas-star7.html
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • ubuntu 安装配置ssh
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • idea tomcat启动时候中文乱码、问号
  • 如何从CRM中获益?看专家怎么说!
  • ECharts初使用,从后台得到数据源
  • linux 使用ssh到远端并且使用while的坑
  • [置顶] 开源史上最成功的8个开源产品
  • 广州大学华软软件学院——NA视频下载
  • #Java异常处理
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • 78. Subsets
  • CentOS7 安装JDK
  • GraphQL学习过程应该是这样的
  • laravel 用artisan创建自己的模板
  • nodejs实现webservice问题总结
  • TypeScript实现数据结构(一)栈,队列,链表
  • Vue.js-Day01
  • vue-loader 源码解析系列之 selector
  • VuePress 静态网站生成
  • 从零开始的无人驾驶 1
  • 关于for循环的简单归纳
  • 机器学习学习笔记一
  • 简单基于spring的redis配置(单机和集群模式)
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 深入 Nginx 之配置篇
  • 回归生活:清理微信公众号
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ​ssh免密码登录设置及问题总结
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • #pragma multi_compile #pragma shader_feature
  • $L^p$ 调和函数恒为零
  • $refs 、$nextTic、动态组件、name的使用
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (七)Java对象在Hibernate持久化层的状态
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (算法)前K大的和
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .NET 5.0正式发布,有什么功能特性(翻译)