Android桌面小部件AppWidget:音乐播放器桌面控制部件Widget(3)


Android桌面小部件AppWidget比较常用的场景就是音乐播放器,音乐播放器虽然通常在后台播放,但需要在桌面提供一个可以控制播放状态的APP widget,为用户提供播放、暂停、停止音乐播放器的功能。
在附录文章1、2的基础上,本文以一个简单的例子加以说明,如何通过桌面小部件实现音乐播放器的播放、停止。简单期间,本例只提供对音乐播放器的两种控制功能:播放和停止。播放,进入后台service播放给定的音乐mp3文件;停止,则直接stopService关闭播放服务即可。
为此,需要在桌面的小部件布局中增加两个按钮,这两个按钮暂时就以Android系统默认的播放(@android:drawable/ic_media_play)和暂停(@android:drawable/ic_media_pause)图片作为按钮使用。当按了播放按钮后,就开始启动后台服务播放mp3音乐文件(暂时以我放置在SDCard根目录下名为zhangphil.mp3的音乐文件为音频源文件);当按了停止按钮后,就stopService,即停止播放。
和附录文章1,2相比,本例不需要更新桌面小部件的表现形式,仅需要处理由桌面小部件传导过来的点击事件,这些响应点击事件,均放置在onReceive里面处理。

(1)

在Androidmanifest.xml里面定义的widget:

                                                                                                                                                                                            


涉及到res/xml目录下的appwidget.xml代码文件:

<?xml version="1.0" encoding="utf-8"?>


(2)service播放音乐。也在Androidmanifest.xml里面定义:

        

(3)核心关键的AppWidget.java代码文件:

package zhangphil.widget;import android.app.PendingIntent;import android.appwidget.AppWidgetManager;import android.appwidget.AppWidgetProvider;import android.content.Context;import android.content.Intent;import android.util.Log;import android.widget.RemoteViews;public class AppWidget extends AppWidgetProvider {@Overridepublic void onReceive(Context context, Intent intent) {super.onReceive(context, intent);// Log.d(this.getClass().getName(), "onReceive");if (intent == null)return;String action = intent.getAction();// 停止播放if (action.equals(Constants.ACTION_STOP)) {Intent serviceIntent = new Intent(context, MyService.class);context.stopService(serviceIntent);}// 点击了按钮,启动一个后台服务播放if (action.equals(Constants.ACTION_PLAY)) {Intent serviceIntent = new Intent(context, MyService.class);context.startService(serviceIntent);}}@Overridepublic void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {Log.d(this.getClass().getName(), "onUpdate");RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.appwidget_layout);// 播放图片作为按钮,绑定播放事件Intent intentPlay = new Intent(Constants.ACTION_PLAY);PendingIntent pendingIntentPlay = PendingIntent.getBroadcast(context, Constants.REQUEST_CODE_PLAY, intentPlay,PendingIntent.FLAG_UPDATE_CURRENT);remoteViews.setOnClickPendingIntent(R.id.play, pendingIntentPlay);// 停止图片作为按钮,绑定停止事件Intent intentStop = new Intent(Constants.ACTION_STOP);PendingIntent pendingIntentStop = PendingIntent.getBroadcast(context, Constants.REQUEST_CODE_STOP, intentStop,PendingIntent.FLAG_UPDATE_CURRENT);remoteViews.setOnClickPendingIntent(R.id.stop, pendingIntentStop);// 更新AppWidgetappWidgetManager.updateAppWidget(appWidgetIds, remoteViews);}/** * 删除AppWidget */@Overridepublic void onDeleted(Context context, int[] appWidgetIds) {super.onDeleted(context, appWidgetIds);Log.d(this.getClass().getName(), "onDeleted");}@Overridepublic void onDisabled(Context context) {super.onDisabled(context);Log.d(this.getClass().getName(), "onDisabled");}/** * AppWidget首次创建调用 */@Overridepublic void onEnabled(Context context) {super.onEnabled(context);Log.d(this.getClass().getName(), "onEnabled");}}

AppWidget.java里面RemoteViews用到的布局文件appwidget_layout.xml:

<?xml version="1.0" encoding="utf-8"?>                


(4)service后台服务MyService.java,该部分代码将负责在后台播放或者停止音播放:

package zhangphil.widget;import java.io.File;import android.app.Service;import android.content.Intent;import android.media.MediaPlayer;import android.os.Environment;import android.os.IBinder;public class MyService extends Service {// 播放器private MediaPlayer mMediaPlayer;// 音频文件private File audioFile;@Overridepublic void onCreate() {super.onCreate();mMediaPlayer = new MediaPlayer();// 根目录File sdcard = Environment.getExternalStorageDirectory();audioFile = new File(sdcard, "zhangphil.mp3");}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {// 重置mMediaPlayer.reset();// 设置播放器的声音源try {mMediaPlayer.setDataSource(audioFile.getAbsolutePath());} catch (Exception e) {e.printStackTrace();}// 也可以从一个静态资源文件中加载音频数据源// mMediaPlayer.create(this, R.raw.xxx);if (!mMediaPlayer.isPlaying()) {try {mMediaPlayer.prepare();} catch (Exception e) {e.printStackTrace();}mMediaPlayer.start();// 如果设置循环true,那么将循环播放// mMediaPlayer.setLooping(true);}return super.onStartCommand(intent, flags, startId);}@Overridepublic void onDestroy() {super.onDestroy();mMediaPlayer.stop();mMediaPlayer.release();mMediaPlayer = null;}@Overridepublic IBinder onBind(Intent intent) {return null;}}

(5)定义的公共静态变量Constants.java:

package zhangphil.widget;public class Constants {public static final String ACTION_PLAY = "action_play";public static final String ACTION_STOP = "action_stop";public static final int REQUEST_CODE_PLAY = 0xd05;public static final int REQUEST_CODE_STOP = 0xd06;}



代码运行结果如图所示:

Android桌面小部件AppWidget:音乐播放器桌面控制部件Widget(3)_第1张图片


附录文章:
1,《Android桌面小部件AppWidget(1)》链接地址:http://blog.csdn.net/zhangphil/article/details/50457355
2,《Android桌面小部件AppWidget(2)》链接地址:http://blog.csdn.net/zhangphil/article/details/50461944

更多相关文章

  1. android 开关按钮
  2. 关于Android Studio中Run按钮是灰色的解决
  3. Android:实现TabWidget选项卡按钮在屏幕下方
  4. 直接从数据库里修改桌面图标
  5. Android标题栏最右边添加按钮
  6. Android 监听按钮点击事件的三种方式(1:匿名内部类;2:外部类;3:接口方
  7. android 自定义返回按钮
  8. android桌面小火箭升空动画
  9. android 日期按钮实现

随机推荐

  1. android开机动画
  2. android 开源项目汇总
  3. Android获取系统时间
  4. android 学习资料
  5. android播放音乐
  6. android实现xml数据的解析
  7. Android CalendarView 使用
  8. Android DOM解析XML
  9. Android自定义弹窗进度条
  10. ch029 Android service aidl