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

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";

    @Override
    public 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 widget
        updateAppWidget(mCurrentMusicItem);
    }

    private void playMusicItem(MusicItem item, boolean reload) {
       ......
       //音乐播放时更新到App widget
       updateAppWidget(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 {
        ......
        @Override
        public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    
            sAppWidgetIds = appWidgetIds;
            //使用默认的参数更新App widget
            performUpdates(context, context.getString(R.string.no_song), false, null);
    
            //发送广播给MusicService,让它调用接口,更新App widget
            Intent 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() {
            @Override
            public void onReceive(Context context, Intent intent) {
    
                String action = intent.getAction();
                if (ACTION_PLAY_MUSIC_UPDATE.equals(action)) {
                    //收到ACTION_PLAY_MUSIC_UPDATE广播,就更新App widget
                    updateAppWidget(mCurrentMusicItem);
                }
            }
        };
    
        @Override
        public void onCreate() {
            super.onCreate();
            ......
            //注册监听器,当收到ACTION_PLAY_MUSIC_UPDATE广播的时候,将触发mIntentReceiver的onReceive()方法被调用
            IntentFilter commandFilter = new IntentFilter();
            commandFilter.addAction(ACTION_PLAY_MUSIC_UPDATE);
            registerReceiver(mIntentReceiver, commandFilter);
            ......
        }
    
        @Override
        public void onDestroy() {
            super.onDestroy();
            ......
            //注销监听器,防止内存泄漏
            unregisterReceiver(mIntentReceiver);
            ......
        }
    
        ......
    }

8.5.2 MusicService没有启动

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

public class AnddleMusicAppWidget extends AppWidgetProvider {

    ......
    @Override
    public void onEnabled(Context context) {

        Intent i = new Intent(context, MusicService.class);
        context.startService(i);
    }

}

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

后记

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

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

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

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



/*******************************************************************/

* 版权声明

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

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

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

/*******************************************************************/

时间: 2024-12-21 21:06:53

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

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

第8节 桌面小工具 桌面小工具是可以放置在主界面的.快速控制应用的小助手.例如我们的音乐小工具,它可以帮助用户在桌面上就完成音乐的暂停.播放.切换等操作,而不需要启动应用本身. 在安卓系统中,我们也常常叫它App widget. 实现一个App widget要经过以下几个步骤, 创建一个App widget类,让它继承自AppWidgetProvider,例如AnddleMusicAppWidget类: 放在res\layout目录下,为App widget的界面定义一个布局,例如anddle_

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

第5节 播放列表的存取 关于播放列表的存取需要三个组件的协同配合, MusicListActivity:让用户选择多首或一首音乐,将用户的选择项,传递给MusicService: MusicService:接收到添加列表的请求后,把数据交给PlayListContentProvider,进行存储: PlayListContentProvider:将播放列表存储到SQLite数据库中: 5.1 PlayListContentProvider的实现 自定义的ContentProvider与系统自带的

手把手教你做音乐播放器(六)存储多首音乐

第6节 存储多首音乐 我们已经能够存储单首音乐了,接下来我们开始添加一次存储多首音乐的界面设计. 当用户长按某首音乐项的时候,将进入ListView的多选modal状态,我们叫它模式框. 6.1 ListView的选择模式 在理解这个模式框之前,我们要先进一步了解一下ListView. ListView本身带有单选和多选功能,也就是说在单选模式下,它能够记住当前选中的唯一的列表项:在多选模式下,它能够记住目前选取的所有的列表项. 这种选择模式共有4种CHOICE_MODE_NONE CHOICE

自定义audio样式做音乐播放器

最近工作需求需要播放预览一些音乐资源,所以自己写了个控制audio的音乐播放器. 实现的原理主要是通过js调整audio的对象属性及对象方法来进行控制: 1.通过play().pause()来控制音乐的播放与暂停 2.通过duration.currentTime获取音乐长度及实时播放进度 3.通过volume.muted对音量大小进行调节 4.通过ended.error检测音乐的播放状态 首先来看一下实现效果:当播放点击音乐时该音乐展示播放进度.进度条.音乐条 本例子实际效果(博客园不允许添加a

Android开发本地及网络Mp3音乐播放器(八)状态存取与界面滑动

实现功能: 退出应用时,保存歌曲位置(也就是当前是第几首歌曲) 退出应用时,保存播放模式(也就是用户设置的是顺序播放/随机播放/单曲循环) 进入应用时,读取歌曲位置 进入应用时,读取播放模式 实现PlayActivity(独立音乐播放界面)的专辑图片layout滑动,滑动后展示歌词layout (目前源码,只实现了专辑图片layout与歌词layout,歌词layout的信息填充后续会进行补充) 截止到目前的源码下载: http://download.csdn.net/detail/iwangh

android 教你制作音乐播放器

呵呵,写之前我本人先笑了,欣赏一下我们清爽的界面吧~ 如果是只用activity来制作这样的东西简直是太小儿科了,此处我们当然用的是service 首先我们先上service的代码: 1.如果我们要访问service的属性和方法,那么在activity肯定是以bindservice的方法实现的,而在service中的onbind方法也是必须要实现的,onbind返回的Ibinder对象在activity的serviceconnection中得到使用. 2.activity获取到Ibinder对象

Xamarin.Android开发音乐播放器

最近.Net开源着实让C#火了一把,好久就听说Mono for Android一直没静下心来看,上周末找来看看,确实不错,前台界面axml编写跟Java安卓开发毫无区别,后台用C#其实很多windows下的方法都可以用,做一个安卓音乐播放器,主要实现音乐播放,上一曲下一曲,音乐播放列表,随机播放,扫描SD卡内所有音乐. 先show一组界面啊,话说有图有真相啊: 项目结构如图: Lrc是歌词处理方法 MusicService是安卓服务播放音乐,服务Broadcast,以及界面接收Receiver

[Android应用]音乐播放器

Service是一个不可见的进程在后台执行. Android中的服务,它与Activity不同,它是不能与用户交互的,不能自己启动的,运行在后台的程序,如果我们退出应用时,Service进程并没有结束,它仍然在后台运行,例如我们打开一个音乐播放器来听音乐,在听音乐的同时也想做下其它的事情,比如上网聊Q.或者上网浏览新闻之类的事情.这样的话,我们就需要用到Service服务了.下面我们以一个简单的音乐播放器的实例来说明下Service的生命周期和Service的使用. 下面是音乐播放器Demo的程

用PHP+H5+Boostrap做简单的音乐播放器(进阶版)

前言:之前做了一个音乐播放器(纯前端),意外的受欢迎,然后有人建议我把后台一起做了,正好也想学习后台,所以学了两天php(不要吐槽我的速度,慢工出细活嘛~)然后在之前的基础上也又完善了一些功能,所以这个Demo比之前的可以算是进阶呢~v2.0哈哈哈~感觉截图体验很不好呢,所以在美图秀秀上面做了简易的动图,大家感受感受 正文: 老规矩,先上图~感觉有点卡,愿意等的就等等嘛,不愿意等的,往下看,有图片讲解 功能实现: 1.点击音乐列表播放音乐 2.拖动或点击进度条,调节音乐播放进度 3.浮动到音量控