音乐播放器widget 后传
[功能]
上次讲的播放器的构建 这次讨论widget 的构建
为了不使得太过臃肿 该widget得功能也比较简单:
写道
1. 用于 换曲 功能
2. 显示从MediaPlayerService 发过来的字串
2. 显示从MediaPlayerService 发过来的字串
写道
以2个功能为代表 演示:
widget 与 后台service 的交互
widget 与 后台service 的交互
[代码 步骤]
1. 构建 widget 所需界面 musicplayerlayout.xml: 1 Buttoon用于换曲 1TextView显示字串
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent" > <Button android:id="@+id/next" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Next!" /> <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
2. 设定 widget 的属性 musicplayersetting.xml 比如:窗口大小设定 刷新率 所需界面
<?xml version="1.0" encoding="utf-8"?> <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="246dip" android:minHeight="22dip" android:updatePeriodMillis="1000" android:initialLayout="@layout/musicplayerlayout" />
3. AppWidgetProvider 因为一些原因 所以觉得把具体的更新 放在 UpdateService 里面完成
写道
UpdateService 的工作:
1. 设立 "换曲" Button 的 sendBroadcast() 工作
2. 定义BroadcastReceiver 用于接收Text 并显示之
1. 设立 "换曲" Button 的 sendBroadcast() 工作
2. 定义BroadcastReceiver 用于接收Text 并显示之
写道
在 widget 上设立监听器 不能像在Activity中那样 其主要通过PendingIntent完成
PendingIntent pi = PendingIntent.getBroadcast(context, requestCode, intent, flags)
主要是通过 Intent 来启用相应功能
1. Activity 跳转 类似于Activity.startActivity()
2. 发送Broadcast 类似于Activity.sendBroadcast()
3. 至于Broadcast 接收 和 Activity中一样
PendingIntent pi = PendingIntent.getBroadcast(context, requestCode, intent, flags)
主要是通过 Intent 来启用相应功能
1. Activity 跳转 类似于Activity.startActivity()
2. 发送Broadcast 类似于Activity.sendBroadcast()
3. 至于Broadcast 接收 和 Activity中一样
1. 设立 "换曲" Button 的 sendBroadcast() 工作
public void setViewBroadcastClickListener(RemoteViews remte,int id,String s){
Intent i = new Intent(s);
PendingIntent pi = PendingIntent.getBroadcast(this,1,i,0);
remte.setOnClickPendingIntent(id, pi);
}
2. 定义BroadcastReceiver 用于接收Text 并显示之
public class MusicWidgetListenerHelper extends BroadcastReceiver {
Context context;
MusicWidgetListenerHelper listener;
//construct
public MusicWidgetListenerHelper(Context c){
context = c;
//to instance it
listener = this;
}
public void registerAction(String action){
IntentFilter filter = new IntentFilter();
filter.addAction(action);
context.registerReceiver(listener,filter);
}
@Override
public void onReceive(Context arg0, Intent arg1) {
// TODO Auto-generated method stub
Bundle b = arg1.getExtras();
if(b.containsKey(MusicPlayerHelper.Message_MusicPlayer_Text)){
String string = b.getString(MusicPlayerHelper.Message_MusicPlayer_Text);
updateMusicText(string);
}
}
}
public void updateMusicText(String s){
remote.setTextViewText(R.id.text,s);
//做界面改动 必须调用updateAppWidget() 刷新
ComponentName thisWidget =
new ComponentName(this, MusicPlayerWidget.class);
AppWidgetManager manager =
AppWidgetManager.getInstance(this);
manager.updateAppWidget(thisWidget, remote);
}
写道
在做界面更新后要调用下面代码使之生效
//做界面改动 必须调用updateAppWidget() 刷新
ComponentName thisWidget =
new ComponentName(this, MusicPlayerWidget.class);
AppWidgetManager manager =
AppWidgetManager.getInstance(this);
manager.updateAppWidget(thisWidget, remote);
//做界面改动 必须调用updateAppWidget() 刷新
ComponentName thisWidget =
new ComponentName(this, MusicPlayerWidget.class);
AppWidgetManager manager =
AppWidgetManager.getInstance(this);
manager.updateAppWidget(thisWidget, remote);
3. 至此 widget 功能也完成了 看看emulator 运行截图吧
* 开始运行效果
2. 按下 Button "Next!" 后的效果 为了看出效果 注意其右边Text 的变化
done!