8.4 MusicService的改造

8.4.1 App widget触发MusicService

App widget的按钮被点击后,会触发隐式定义的Intent发送给MusicService。例如当下一首按钮被点击后,携带action-MusicService.ACTION_PLAY_MUSIC_NEXT的Intent将触发MusicServiceonStartCommand()函数。

我们可以在onStartCommand()函数当中接收到App widget要求的操作命令,进行相应的处理。

public class MusicService extends Service {public static final String ACTION_PLAY_MUSIC_PRE = "com.anddle.anddlemusic.playpre";public static final String ACTION_PLAY_MUSIC_NEXT = "com.anddle.anddlemusic.playnext";public static final String ACTION_PLAY_MUSIC_TOGGLE = "com.anddle.anddlemusic.playtoggle";@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {if(intent != null) {//获取App widget发来的操作命令String action = intent.getAction();if (action != null) {if (ACTION_PLAY_MUSIC_PRE.equals(action)) {//播放前一首音乐playPreInner();} else if (ACTION_PLAY_MUSIC_NEXT.equals(action)) {//播放下一首音乐playNextInner();} else if (ACTION_PLAY_MUSIC_TOGGLE.equals(action)) {//根据当前播放的状态暂停或继续播放音乐if (isPlayingInner()) {pauseInner();} else {playInner();}}}}return super.onStartCommand(intent, flags, startId);}}

8.4.2 MusicService更新App widget

MusicService自身的播放状态发生变化的时候,比如开始播放、暂停播放,就需要更新App widget的显示,

public class MusicService extends Service {......//将音乐的播放信息更新到App widget中private void updateAppWidget(MusicItem item) {if (item != null) {//创建音乐封面if(item.thumb == null) {ContentResolver res = getContentResolver();item.thumb = Utils.createThumbFromUir(res, item.albumUri);}//调用App widget提供的更新接口开始更新AnddleMusicAppWidget.performUpdates(MusicService.this, item.name, isPlayingInner(), item.thumb);}}private void pauseInner() {......//音乐暂停时更新到App widgetupdateAppWidget(mCurrentMusicItem);}private void playMusicItem(MusicItem item, boolean reload) {......//音乐播放时更新到App widgetupdateAppWidget(mCurrentMusicItem);}}

8.5 App widget的初始化

当App widget被添加到桌面或者系统启动后让App widget在桌面显示出来,需要显示当前的播放信息。

假如MusicService已经在后台运行着,那么App widget只需要在onUpdate()的时候通知MusicService,让MusicService调用接口更新一下自己。

假如是刚刚开机,MusicService还没有运行起来,那么App widget需要让MusicService`先运行起来,再调用接口更新一下自己。

8.5.1 MusicService已经启动

  1. AnddleMusicAppWidgetonUpdate()中,向已经启动的MusicService发送一个广播,告诉它App widget需要被更新一下,

    public class MusicService extends Service {......@Overridepublic void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {sAppWidgetIds = appWidgetIds;//使用默认的参数更新App widgetperformUpdates(context, context.getString(R.string.no_song), false, null);//发送广播给MusicService,让它调用接口,更新App widgetIntent updateIntent = new Intent(MusicService.ACTION_PLAY_MUSIC_UPDATE);context.sendBroadcast(updateIntent);}
    }
  2. MusicService在启动之后,要随时监听App widget发出的MusicService.ACTION_PLAY_MUSIC_UPDATE广播,一旦收到这个广播,就要响应去跟新App widget界面,

    public class MusicService extends Service {......//定义广播名称public static final String ACTION_PLAY_MUSIC_UPDATE = "com.anddle.anddlemusic.playupdate";//定义ACTION_PLAY_MUSIC_UPDATE广播的监听器private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if (ACTION_PLAY_MUSIC_UPDATE.equals(action)) {//收到ACTION_PLAY_MUSIC_UPDATE广播,就更新App widgetupdateAppWidget(mCurrentMusicItem);}}};@Overridepublic void onCreate() {super.onCreate();......//注册监听器,当收到ACTION_PLAY_MUSIC_UPDATE广播的时候,将触发mIntentReceiver的onReceive()方法被调用IntentFilter commandFilter = new IntentFilter();commandFilter.addAction(ACTION_PLAY_MUSIC_UPDATE);registerReceiver(mIntentReceiver, commandFilter);......}@Overridepublic void onDestroy() {super.onDestroy();......//注销监听器,防止内存泄漏unregisterReceiver(mIntentReceiver);......}......
    }

8.5.2 MusicService没有启动

如果设备刚开机,而桌面又添加了音乐的App widget,那么就让App widget在被加载到桌面上的时候(onEnabled()被触发时)启动MusicService

public class AnddleMusicAppWidget extends AppWidgetProvider {......@Overridepublic void onEnabled(Context context) {Intent i = new Intent(context, MusicService.class);context.startService(i);}}

之后更新App widget的流程就和MusicService已经启动了的流程一致了。

后记

经过前面几个章节,音乐播放器已经完成了。

我们可以多放一点音乐进去,用它实际的播放歌曲。虽然功能基本上开发完了,但是少不了测试的环节。就目前我们的开发水平而言,我们可以通过多使用,来寻找软件的Bug。如果遇到崩溃、或者使用时发现的设计不合理的地方,就根据自己的想法来修改。逐步的让音乐播放器变成一个稳定实用的应用。

在功能规划的时候,我们还省去了不少实用的功能,也许在下一版本的音乐播放器中,我们就可以添加上其中的部分功能了。

在经过了“安豆计算器” “视频播放器” “蓝牙聊天应用”和“音乐播放器”以后,我相信大家一定对安卓应用开发有了较为深刻的理解了。至此,大家已经入门了,恭喜恭喜。


/*******************************************************************/
* 版权声明
* 本教程只在CSDN和安豆网发布,其他网站出现本教程均属侵权。

*另外,我们还推出了Arduino智能硬件相关的教程,您可以在我们的网店跟我学Arduino编程中购买相关硬件。同时也感谢大家对我们这些码农的支持。

*最后再次感谢各位读者对安豆的支持,谢谢:)
/*******************************************************************/

手把手教你做音乐播放器(八)桌面小工具(下)(完)相关推荐

  1. 手把手教你做音乐播放器(一)功能规划

    前言 学习完"计算器" "视频播放器" "蓝牙聊天"以后,对安卓应用的开发我们基本上就入门70%了. 现在,我们将在之前学习的基础上,进一步 ...

  2. 手把手教你做音乐播放器(八)桌面小工具(上)

    第8节 桌面小工具 桌面小工具是可以放置在主界面的.快速控制应用的小助手.例如我们的音乐小工具,它可以帮助用户在桌面上就完成音乐的暂停.播放.切换等操作,而不需要启动应用本身. 在安卓系统中,我们也常 ...

  3. 手把手教你做音乐播放器(四)播放服务的搭建

    第4节 播放服务的搭建 播放音乐的服务-MusicService是整改音乐播放器的核心,它将播放界面和实际的播放功能连接在一起. 4.1 MusicService的接口 它对外要提供两类主要的功能,播 ...

  4. 手把手教你做音乐播放器(五)音乐列表的存储(上)

    第5节 播放列表的存取 关于播放列表的存取需要三个组件的协同配合, MusicListActivity:让用户选择多首或一首音乐,将用户的选择项,传递给MusicService: MusicServi ...

  5. 手把手教你做音乐播放器(七)播放音乐(上)

    第7节 播放音乐 音乐播放列表也准备好了,我们来播放音乐吧.完成后效果如下, 实现音乐的播放,我们需要播放界面和音乐服务两个方面的合作. 7.1 MusicService 前面我们已经为播放音乐的功能 ...

  6. 手把手教你做音乐播放器(三)获取音乐信息

    第3节 获取音乐信息 在"视频播放器"的开发过程当中,我们已经学会了如何获取视频文件的信息: 定义一个视频信息的数据结构VideoItem: 自定义一个AnsycTask,在它的工 ...

  7. iOS开发--手把手教你制作音乐播放器

    我个人之前有个想法,把平常用的小软件,闲暇之余自己都实现一个迷你版本,打造自己的app专属文件夹,比如闹钟.音乐播放器.视频播放器.电子书以及贪吃蛇之类的小游戏.我相信通过实现这些小程序,能够进一步熟 ...

  8. Vue项目——手把手教你做出音乐播放器

    进入VueMusic-安装所需的东西 cnpm install 之后 启动这个项目 npm start App.vue 设置默认样式 <template><div id=" ...

  9. 基于STC89C52做音乐播放器(小星星)

    STC89C52做音乐播放器 内部晶振11.0592MHZ C大调音符对照表 ###TH0,TL0初始值 小星星乐谱 硬件电路实现 用于驱动蜂鸣器 ###蜂鸣器 实现代码(运用模块化编程) ###主函 ...

最新文章

  1. 关于 0xCCCCCCCC
  2. Spring Cloud Alibaba基础教程:Nacos的数据持久化
  3. [20170412]bbed恢复修改记录(不等长).txt
  4. wordpressQQ登陆php代码,仅在登录时使用wordpress PHP代码
  5. js ‘use strict’详解
  6. mysql xa 使用_MySQL如何实现 XA 规范
  7. Linux下软件安装和删除的命令
  8. j - cyk追楠神系列一_「清单」小米烧水杯太萌了,喜茶桂花冻太香了,优衣库新系列太美了!...
  9. js判断中文字符串长度和js截取中文字符串
  10. Useful SQL script
  11. iOS安全攻防(十三):数据擦除
  12. DAMS峰会丨从数仓到数据中台,从数据资源到资产,京东、携程、快手等是怎么建设和演进的?...
  13. html打开ppt自动播放,PPT怎么自动播放
  14. 《动手学深度学习》| 2 深度学习基础
  15. C++ 的未来——第 2 部分
  16. 哈希算法原理与应用:确保数据完整性和安全性的关键技术
  17. Java基础语法(三)——运算符
  18. 自动驾驶深度多模态目标检测和语义分割:数据集、方法和挑战
  19. matplotlib自定义添加 “哆啦A梦”背景图,这个操作真牛逼!
  20. Ice自学第一步——Windows下安装Ice和设置Ice的环境变量

热门文章

  1. EditText输入类型InputType值
  2. ubuntu LTS 18.04安装NS2 配置方法
  3. 电报登陆收不到验证码_紧急扩散!这片海域船舶注意!超强台风奔袭,13日夜间将登陆(附防台措施)...
  4. 电脑C盘红了怎么办?—— 保姆级从根本上解决问题(C盘扩容)
  5. 为服务器安装网卡驱动
  6. Ettercap系列 I+:名词解释
  7. PB修改器,powerbuilder源码下载,pb反编译大师,最新测试版
  8. [C/C++学习] restrict 关键字
  9. mysql修改为北京时间
  10. 与MQTT的初定情缘