在第四篇文章的到最后显示了通知栏,那么为什么我要把通知的的操作单独放到一篇文章来进行讲解呢?因为里面有很多业务逻辑,还有通信的关系,所以才这么做的。
要实现具体的业务功能,首先要监听到点击事件,这一点是毋庸置疑的,谁赞成,谁反对。首先增加几个全局变量,打开Constant
/**
- 歌曲播放
*/
public static final String PLAY = “play”;
/**
- 歌曲暂停
*/
public static final String PAUSE = “pause”;
/**
- 上一曲
*/
public static final String PREV = “prev”;
/**
- 下一曲
*/
public static final String NEXT = “next”;
/**
- 关闭通知栏
*/
public static final String CLOSE = “close”;
/**
- 进度变化
*/
public static final String PROGRESS = “progress”;
这些都是用来表明当前歌曲的状态的,至关重要。之前我通过RemoteViews来指定一个布局文件,从而实现自定义通知栏样式的效果,那么对于通知栏页面的按钮的点击事件,也是交给RemoteViews来完成来的,下面进行实例化,把它变成成员变量。
在Service中实例化
private static RemoteViews remoteViews;
然后单独写一个方法对RemoteViews进行初始化配置。
/**
- 初始化自定义通知栏 的按钮点击事件
*/
private void initRemoteViews() {
remoteViews = new RemoteViews(this.getPackageName(), R.layout.notification);
//通知栏控制器上一首按钮广播操作
Intent intentPrev = new Intent(PREV);
PendingIntent prevPendingIntent = PendingIntent.getBroadcast(this, 0, intentPrev, 0);
//为prev控件注册事件
remoteViews.setOnClickPendingIntent(R.id.btn_notification_previous, prevPendingIntent);
//通知栏控制器播放暂停按钮广播操作 //用于接收广播时过滤意图信息
Intent intentPlay = new Intent(PLAY);
PendingIntent playPendingIntent = PendingIntent.getBroadcast(this, 0, intentPlay, 0);
//为play控件注册事件
remoteViews.setOnClickPendingIntent(R.id.btn_notification_play, playPendingIntent);
//通知栏控制器下一首按钮广播操作
Intent intentNext = new Intent(NEXT);
PendingIntent nextPendingIntent = PendingIntent.getBroadcast(this, 0, intentNext, 0);
//为next控件注册事件
remoteViews.setOnClickPendingIntent(R.id.btn_notification_next, nextPendingIntent);
//通知栏控制器关闭按钮广播操作
Intent intentClose = new Intent(CLOSE);
PendingIntent closePendingIntent = PendingIntent.getBroadcast(this, 0, intentClose, 0);
//为close控件注册事件
remoteViews.setOnClickPendingIntent(R.id.btn_notification_close, closePendingIntent);
}
目前通知栏上看到的按钮只有四个,因为播放和暂停是一个按钮,到时候可以根据MediaPlayer的播放状态做进一步的处理,上面四个按钮,点击之后会发送一个广播,既然有广播,那自然要有一个广播接收器,就好比,你到淘宝上买衣服,别人给你发货了,你总要设置一个收货地址吧。这是一个道理的。至于广播接收器,可以写在Service里面,作为一个内部类使用。那么先创建这个内部类。
/**
- 广播接收器 (内部类)
*/
public class MusicReceiver extends BroadcastReceiver {
public static final String TAG = “MusicReceiver”;
@Override
public void onReceive(Context context, Intent intent) {
//UI控制
UIControl(intent.getAction(), TAG);
}
}
然后来看看UIControl方法。
/**
-
页面的UI 控制 ,通过服务来控制页面和通知栏的UI
-
@param state 状态码
-
@param tag
*/
private void UIControl(String state, String tag) {
switch (state) {
case PLAY:
BLog.d(tag,PLAY+" or "+PAUSE);
break;
case PREV:
BLog.d(tag,PREV);
break;
case NEXT:
BLog.d(tag,NEXT);
break;
case CLOSE:
BLog.d(tag,CLOSE);
break;
default:
break;
}
}
对应四个通知