我们以音乐播放器为例子做一个通知到 通知栏(并且我们要求点击按钮切换通知栏按钮状态并做切歌的操作) 我们先写一个广播
public class XMPlayerReceiver extends BroadcastReceiver { public static final String PLAY_PRE = "play_pre"; public static final String PLAY_NEXT = "play_next"; public static final String PLAY_PAUSE = "play_pause"; public static final String PLAY_PLAY = "play_play"; @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(PLAY_NEXT)){//PLAY_NEXT Log.e("XMPlayerReceiver", "通知栏点击了下一首"); } if (intent.getAction().equals(PLAY_PRE)) {; Log.e("XMPlayerReceiver", "通知栏点击了上一首"); } if (intent.getAction().equals(PLAY_PAUSE)) { Log.e("XMPlayerReceiver", "通知栏点击了暂停"); } if (intent.getAction().equals(PLAY_PLAY)) { Log.e("XMPlayerReceiver", "通知栏点击了开始"); } } }AndroidManifest.xml中注册上我们写的广播
<receiver android:name=".app.audioheler.ability.XMPlayerReceiver" android:exported="true" android:process=":player"> <intent-filter> <action android:name="play_pre" /> <action android:name="play_next" /> <action android:name="play_pause" /> <action android:name="play_play" /> </intent-filter> </receiver>准备好广播之后我们发一个推送到通知栏。
先自定义一个RemoteViews ,xml自己写
private RemoteViews initNotifyView(Bitmap bitmap) { String packageName = context.getPackageName(); RemoteViews remoteView = new RemoteViews(packageName, R.layout.你的xml); remoteView.setImageViewBitmap(R.id.xml中放图的imageview id, Bitmap位图); remoteView.setTextViewText(R.id.xml中标题的id, "标题内容"); remoteView.setTextViewText(R.id.xml中小标题的id, "小标题内容"); Intent prv = new Intent(context,XMPlayerReceiver.class);//播放上一首 prv.setAction(PLAY_PRE); PendingIntent intent_prev = PendingIntent.getBroadcast(context, 1, prv, PendingIntent.FLAG_UPDATE_CURRENT); remoteView.setOnClickPendingIntent(R.id.上一首按钮的id, intent_prev); Intent next = new Intent(context,XMPlayerReceiver.class);//播放下一首 next.setAction(PLAY_NEXT); PendingIntent intent_next = PendingIntent.getBroadcast(context, 2, next, PendingIntent.FLAG_UPDATE_CURRENT); remoteView.setOnClickPendingIntent(R.id.下一首按钮的id, intent_next); Intent startpause = new Intent(context,XMPlayerReceiver.class);//暂停 startpause.setAction(PLAY_PAUSE); PendingIntent intent_pause = PendingIntent.getBroadcast(context, 3, startpause, PendingIntent.FLAG_UPDATE_CURRENT); remoteView.setOnClickPendingIntent(R.id.暂停按钮的id, intent_pause); Intent startplay = new Intent(context,XMPlayerReceiver.class);//播放 startplay.setAction(PLAY_PLAY); PendingIntent intent_play = PendingIntent.getBroadcast(context, 4, startplay, PendingIntent.FLAG_UPDATE_CURRENT); remoteView.setOnClickPendingIntent(R.id.播放按钮的id, intent_play); return remoteView; }现在把自定义的样式发到通知栏上
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); String channelId = "notification"; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {//适配一下高版本 NotificationChannel channel = new NotificationChannel(channelId, "listen", NotificationManager.IMPORTANCE_DEFAULT); channel.enableLights(false); //是否在桌面icon展示小红点 channel.setLightColor(Color.RED); //小红点颜色 channel.setSound(null, null);//关了通知默认提示音 channel.setShowBadge(false); //是否在久按桌面图标时显示此渠道的通知 notificationManager.createNotificationChannel(channel); } NotificationCompat.Builder builder = new NotificationCompat.Builder(context, channelId) .setSmallIcon(R.mipmap.ic_launcher)//这玩意在通知栏上显示一个logo .setCategory(CATEGORY_MESSAGE) .setDefaults(DEFAULT_ALL) .setOngoing(true); //点击通知栏跳转的activity Intent intent = new Intent(context, NotifyActivity.class); PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); builder.setAutoCancel(false);//点击不让消失 builder.setSound(null);//关了通知默认提示音 builder.setPriority(PRIORITY_MAX);//咱们通知很重要 builder.setVibrate(null);//关了车震 builder.setContentIntent(pendingIntent);//整个点击跳转activity安排上 builder.setOnlyAlertOnce(false); RemoteViews remoteViews = initNotifyView(bitmap); builder.setContent(remoteViews);//把自定义view放上 builder.setCustomBigContentView(remoteViews);//把自定义view放上 Notification notification = builder.build(); notification.flags |= FLAG_ONGOING_EVENT; notification.flags |= Notification.FLAG_NO_CLEAR;//不让手动清除 通知栏常驻 notification.sound = null;//关了通知默认提示音 notificationManager.notify(notifyId, notification);需要的时候调用上段代码将通知发到通知栏上 在BroadcastReceiver 中接收点击事件。若更新通知栏的样式,重新创建RemoteViews再发一遍通知好了 notifyId使用同一个。
当我们不需要这个通知栏播放器时 直接关闭通知
notificationManager.cancel(notifyId);这俩biang玩意别跟别的app重了 带上自己包名
如有不重发通知更新通知栏的方法请告诉我
