简单代码书写过程,先框架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");
}
}
源码工程下载:点击打开链接