新手写musicwidget
来源:互联网 发布:北京知行 pt 编辑:程序博客网 时间:2024/04/27 23:44
简单代码书写过程,先框架BlueMusicAppWidgetProvider.java和文件MusicService.java
接着AndroidManifest.xml其中android:resource="@xml/bluemusic_appwidget_info"
接着res下新建目录xml里面放bluemusic_appwidget_info.xml文件其中调用bluemusic_widget.xml
接着就该写bluemusic_widget.xml了
接着要写以及完善BlueMusicAppWidgetProvider.java和MusicService.java了
流程小结
当把小组件musicwidget拖到待机界面时,在AndroidManifest.xml中注册的receiver(BlueMusicAppWidgetProvider)
被执行,先执行其中的onReceive接着执行onEnabled,而在onEnabled中我们有通过
new Intent(context, MusicService.class);
context.startService(intent);
从而启动了MusicService(此在AndroidManifest.xml注册为service).
接着在BlueMusicAppWidgetProvider的onUpdate中把ImageButton与广播消息联系起来(例如control_play---pplay---iplay),
可以理解为当按下play键(图)时,就发广播(com.shop.bluemusicappwidget.playorpause),而在MusicService接收到该广播并进行
相关的处理.
代码中对play和pause的处理是MusicService发送广播而BlueMusicAppWidgetProvider接收到此类广播对按键图做变化显示,而此处的
广播内容均是在AndroidManifest.xml中注册的(<action android:name="com.shop.bluemusicappwidget.play"/>)
看图
BlueMusicAppWidgetProvider.java文件
package com.shop.bluemusicappwidget;import android.app.PendingIntent;import android.appwidget.AppWidgetManager;import android.appwidget.AppWidgetProvider;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.util.Log;import android.widget.RemoteViews;public class BlueMusicAppWidgetProvider extends AppWidgetProvider { @Override public void onReceive(Context context, Intent intent) { super.onReceive(context, intent); String action = intent.getAction(); RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.bluemusic_widget); Log.v("shopping", "onReceive"); if (action.equals("com.shop.bluemusicappwidget.play")) { Log.v("shopping", "appwidget_music_pause"); views.setImageViewResource(R.id.control_play, R.drawable.appwidget_music_pause); } else if (action.equals("com.shop.bluemusicappwidget.pause")) { Log.v("shopping", "appwidget_music_play"); views.setImageViewResource(R.id.control_play, R.drawable.appwidget_music_play); } AppWidgetManager mgr = AppWidgetManager.getInstance(context); mgr.updateAppWidget(new ComponentName(context, BlueMusicAppWidgetProvider.class), views); } @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { super.onUpdate(context, appWidgetManager, appWidgetIds); Log.v("shopping", "onUpdate"); RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.bluemusic_widget); Intent inext = new Intent("com.shop.bluemusicappwidget.next"); PendingIntent pnext = PendingIntent.getBroadcast(context, 0, inext, 0); Intent iprevious = new Intent("com.shop.bluemusicappwidget.previous"); PendingIntent pprevious = PendingIntent.getBroadcast(context, 0, iprevious, 0); Intent iplay = new Intent("com.shop.bluemusicappwidget.playorpause"); PendingIntent pplay = PendingIntent.getBroadcast(context, 0, iplay, 0); views.setOnClickPendingIntent(R.id.control_next, pnext); views.setOnClickPendingIntent(R.id.control_pre, pprevious); views.setOnClickPendingIntent(R.id.control_play, pplay); AppWidgetManager mgr = AppWidgetManager.getInstance(context); mgr.updateAppWidget(new ComponentName(context, BlueMusicAppWidgetProvider.class), views); } @Override public void onDisabled(Context context) { super.onDisabled(context); Log.v("shopping", "onDisabled"); Intent intent = new Intent(context, MusicService.class); context.stopService(intent); } @Override public void onEnabled(Context context) { super.onEnabled(context); Log.v("shopping", "onEnabled"); Intent intent = new Intent(context, MusicService.class); context.startService(intent); }}
MusicService.java
package com.shop.bluemusicappwidget;import java.io.File;import java.io.IOException;import java.util.ArrayList;import java.util.List;import android.app.Service;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.media.MediaPlayer;import android.os.IBinder;import android.util.Log;public class MusicService extends Service { private MediaPlayer player; private List<String> data; private int location = 0; private BroadcastReceiver receiver; @Override public void onCreate() { super.onCreate(); Log.v("shopping", "music service create"); } @Override public void onStart(Intent intent, int startId) { super.onStart(intent, startId); Log.v("shopping", "music service onStart"); player = new MediaPlayer(); data = new ArrayList<String>(); Log.v("shopping", "loading music"); File file = new File("/mnt/internal/music"); File[] files = file.listFiles(); for (File f : files) { if (f.isFile() && f.getName().endsWith(".mp3")) { data.add(f.getAbsolutePath()); } } Log.v("shopping", "music loaded !"); Log.v("shopping", "total music = !" + data.size()); try { player.setDataSource(data.get(location)); player.prepare(); } catch (IllegalArgumentException e1) { e1.printStackTrace(); } catch (IllegalStateException e1) { e1.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); } receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Log.v("shopping", "music service BroadcastReceiver"); String action = intent.getAction(); if (action.equals("com.shop.bluemusicappwidget.playorpause")) { if (!player.isPlaying()) { try { player.start(); sendPlay(); } catch (IllegalStateException e) { e.printStackTrace(); } } else { player.pause(); sendPause(); } } else if (action .equals("com.shop.bluemusicappwidget.next")) { playNext(); } else if (action .equals("com.shop.bluemusicappwidget.previous")) { playPrevious(); } } }; IntentFilter filter = new IntentFilter(); filter.addAction("com.shop.bluemusicappwidget.next"); filter.addAction("com.shop.bluemusicappwidget.playorpause"); filter.addAction("com.shop.bluemusicappwidget.previous"); registerReceiver(receiver, filter); } public void playNext() { if (location < data.size() - 1) { location++; } else if (location == data.size() - 1) { location = 0; } play(); } public void playPrevious() { if (location == 0) { location = data.size() - 1; } else if (location > 0) { location--; } play(); } public void play() { Log.v("shopping", "music " + location); try { player.reset(); player.setDataSource(data.get(location)); player.prepare(); player.start(); sendPlay(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } @Override public void onDestroy() { unregisterReceiver(receiver); super.onDestroy(); } @Override public IBinder onBind(Intent intent) { return null; } /** * 发送播放通知,以便widget改变图标样式 */ public void sendPlay() { Intent play = new Intent("com.shop.bluemusicappwidget.play"); sendBroadcast(play); Log.v("shopping", "sendBroadcast---play"); } public void sendPause() { Intent play = new Intent("com.shop.bluemusicappwidget.pause"); sendBroadcast(play); Log.v("shopping", "sendBroadcast---pause"); }}
源码工程下载:点击打开链接
- 新手写musicwidget
- 新手写博客
- 新手写脚本注意
- 新手写makefile
- 新手写模板函数
- 新手写博客
- 新手写LinuxI2C驱动程序
- 新手写OFBiz的HelloWorld
- 新手菜鸟第一次写博客
- 新手写OFBiz的HelloWorld
- Python]新手写爬虫全过程
- collectionview写的新手引导
- 一个c++新手写的迷宫,新手向,原生态
- delphi 5.0写登录界面(新手)
- 献给写作者的 Markdown 新手指南
- 献给写作者的 Markdown 新手指南
- 新手写javascript常犯的错误
- 新手写代码的经验教训小结
- 电脑前的正确坐姿(避免得肩周炎哦)
- 软件应用无所不在 正吞噬整个世界
- Android SDK Manager下载和更新失败的解决方法!!!
- spring知识浅谈一
- SQLite在多线程环境下的应用
- 新手写musicwidget
- 安装软件集
- Spring定时服务
- Android 带清除功能的输入框控件ClearEditText,仿IOS的输入框
- hdu Holiday's Accommodation
- gmail pgp 签名工具
- administrator账户被禁用
- 纯虚函数能为private吗?
- 串并并串转换