音乐播放器 第8节 桌面小工具

第8节 桌面小工具

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

在安卓系统中,我们也常常叫它App widget

实现一个App widget要经过以下几个步骤,

  1. 创建一个App widget类,让它继承自AppWidgetProvider,例如AnddleMusicAppWidget类;
  2. 放在res\layout目录下,为App widget的界面定义一个布局,例如anddle_music_app_widget.xml
  3. res\xml目录下,定义一个App widget的说明文件,例如anddle_music_app_widget_info.xml
  4. AndroidManifest.xml文件当中,声明App widget

8.1 小工具框架的创建

对于使用Android Studio的用户来说,完成上面四个步骤的方法非常简单。因为Android Studio提供了简单的可视化向导来帮助我们。

  1. 在项目工程上点击右键,选择new->Wideget->App Widget就为我们创建好了开发用的模版,非常的简单方便。

  2. 在弹出的创建向导中,填上创建的参数,

    1. App widget取个名字-AnddleMusicAppWidget;
    2. 允许将App widget放到主界面上;
    3. 不允许App widget的显示区域动态调整;
    4. App widget占用3格宽1格高;

    这些参数最后将反应在res/xml/anddle_music_app_widget.info.xml这个配置文件当中,

运行起来,就可以开始将App widget添加到桌面了。

8.2 界面设计

现在,我们开始修改布局文件anddle_music_app_widget.xml,将App widget设计成如下的效果,

然后修改anddle_music_app_widget_info.xmlandroid:previewImage属性,让它指向的图片变成预览的效果图,

8.3 AnddleMusicAppWidget的重建

AnddleMusicAppWidget类负责App widget的逻辑响应。

8.3.1 AppWidget原理

继承AppWidgetProvider之后,开发者可以选择的实现onUpdate() onAppWidgetOptionsChanged() onDeleted() onEnabled() onDisabled()onRestored()等多个函数,

桌面上可以同时添加多个相同的App widget,系统会为每个App widget分配一个id,以便将来更新它们或者对它们进行别的操作时,能够正确的区分它们。

假设现在桌面上没有我们音乐播放器对应的App widget,此时添加一个的话,会依次触发,

如果此时继续添加,会接着触发,

如果系统要更新App widget的显示,也会触发,

此时删除一个,会触发,

此时再删除最后一个,会触发,

当设备开机,会触发,

App widget的设计框架中,每个显示出来的小工具界面,叫做RemoteViews,它是由如下方式创建的,

然后由RemoteViews提供的设置方法,来设置界面上每个元素的样子,比如某个TextView该显示什么文字,某个ImageView该显示什么图片,某个Button被点击后要触发什么操作等等。

然后,通过调用系统提供的AppWidgetManager.updateAppWidget(),将这个界面更新到App widget上面去,

所以AnddleMusicAppWidget要提供一个对外调用的接口,让其它组件可以在需要的时候更新小工具界面。

8.3.2 App widget的界面元素

前面提到了RemoteViews的创建方法。现在来详细介绍下界面上每个元素的设置方式,比如某个TextView该显示什么文字,某个ImageView该显示什么图片,某个Button被点击后要触发什么操作等等。

8.3.2.1 设置TextView的文字

如果创建RemoteViews的布局中有TextView控件,并需要设置内容,

8.3.2.2 设置ImageView的背景图片

如果创建RemoteViews的布局中有ImageView控件,并需要设置图片内容,

8.3.2.3 控件的其它属性

除了上面提到的控件和属性,控件的很多属性并专门的设置函数。不过RemoteViews为我们引入了更加灵活的设置方式。例如要设置Buttonbackground属性,

8.3.2.4 Button的响应

如果创建RemoteViews的布局中有Button控件,为它添加点击响应,

RemoteViews不能直接设置按钮点击后的操作,必须通过设置PendingIntent来实现。所以要在响应的模块中添加响应的逻辑。

8.3.3 AnddleMusicAppWidget实现

  1. 继承AppWidgetProvider,准备实现onUpdate()函数,并提供performUpdates()的静态函数作为其它组件刷新界面的接口,搭建的代码结构如下,

  2. 实现对界面元素的逻辑控制,

8.4 MusicService的改造

8.4.1 App widget触发MusicService

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

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

8.4.2 MusicService更新App widget

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

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需要被更新一下,

  2. MusicService在启动之后,要随时监听App widget发出的MusicService.ACTION_PLAY_MUSIC_UPDATE广播,一旦收到这个广播,就要响应去跟新App widget界面,

8.5.2 MusicService没有启动

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

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


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