文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Android:在service和activity之中,实现音乐播放进度条传递信息的两种方式

2022-06-06 14:06

关注

实现播放时的进度条显示,或是定时从service获取某些信息,是我们日常开发中经常遇到的需求,下面介绍当音乐再service中运行时,activity如果获取音乐进度信息的两种方式:

一、在activity中建立消息接收机制

我们需要在activity中建立一个用于接收信息的handler(handler简单的说是在android中可以发送消息和也可以处理消息的一种机制,当然它的用途更加强大,有时间可以去自己了解)

我们需要在onCreate方法之前添加handler,这样才能保证当我们的activity被destroy之后,再重建时可以第一时间获取当前音乐的进度。

下面是代码,有的同学可能看出来了,这个Handler的handleMessage被重写了,handleMessage写在了new Handler.Callback()回调函数中,返回值变成了boolean,其实这样做是为了防止内存泄漏,当然如果你能忍受Android Studio那一坨巨大的黄色警告你也可以选择用原本的handler方法,

	//当前音乐播放进度
    private static TextView nowTime;
	//音乐进度条
    static SeekBar songseek;
    //运用Handler中的handleMessage方法接收service传递的音乐播放进度信息
    public static Handler handler = new Handler(new Handler.Callback() {
        @Override
        public boolean handleMessage(Message msg) {
            // super.handleMessage(msg);
            // 将SeekBar位置设置到当前播放位置,
            // msg.arg1是service传过来的音乐播放进度信息,将其设置为进度条进度
            songseek.setProgress(msg.arg1);
            //将进度时间其转为mm:ss时间格式
            nowTime.setText(new SimpleDateFormat("mm:ss",Locale.getDefault()).format(new Date(msg.arg1)));
            return false;
        }
    });
	//下面才是android的onCreate方法
	protected void onCreate(Bundle savedInstanceState) {
		......
	}
二、在service中建立一个定时器来定时发送音乐进度信息
		//开始播放音乐
       	mediaPlayer.start();
      	//每隔50毫秒发送音乐进度
      	Timer timer = new Timer();
       	timer.schedule(new TimerTask() {
        	@Override
       		public void run() {
       			//实例化一个Message对象
				Message obtain = Message.obtain();
				//Message对象的arg1参数携带音乐当前播放进度信息,类型是int
            	obtain.arg1 = mediaPlayer.getCurrentPosition();
            	MainActivity.handler.sendMessage(obtain);
       		}
        }, 0, 50);

当然你也可以使用线程的方式来发现音乐进度信息,不过在这里并不推荐,因为单纯的音乐播放进度信息而已,没有必要用到线程来传信息,而已每一次执行都会创建一个线程,这样很浪费资源

		//创建一个线程每隔100毫秒发送一次信息
        Runnable runnable = new Runnable() {
		@Override
			public void run() {
				while (true) {
					try {
						Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    Message obtain = Message.obtain();
                    obtain.arg1 = mediaPlayer.getCurrentPosition();
                    MainActivity.handler.sendMessage(obtain);
                    }
                 }
            };
        Thread musicThread = new Thread(runnable);
        musicThread.start();
附:MediaPlayer做音乐播放器采坑以及解决办法 1.千万不要把mediaPlayer.getDuration()放在定时任务里

因为mediaPlayer.prepare()的执行速度很低,有概率出现mediaPlayer.prepare()还在执行中,突然定时器里刚刚好到时间该调用mediaPlayer.getDuration()这个方法,结果就是mediaPlayer.prepare()因为没有初始化成功就调用mediaPlayer.getDuration()而报下面的错误导致程序闪退。

java.lang.IllegalStateException android.media.MediaPlayer._prepare(Native Method)

(当然如果你的定时操作间隔很大出错的概率就越小,不过我强迫症就是忍不了)

2.上面提到mediaPlayer.prepare()的执行速度很低,如何解决

使用mediaPlayer.prepare()时,正常操作是:

	mediaPlayer.prepare();
	mediaPlayer.start();

建议使用 mediaPlayer.prepareAsync()来代替mediaPlayer.prepare(),下面的代码可以取代上面

	mediaPlayer.prepareAsync();
	//需要设置一个监听器
	mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
		@Override
		public void onPrepared(MediaPlayer mp) {
			mediaPlayer.start();
		}
	});

看一下效果

Android作业 音乐播放器

Incimo 原创文章 31获赞 30访问量 7115 关注 私信 展开阅读全文
作者:Incimo


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯