【问题】推送样式如下:
推送新样式.png
【答案】可以。
【知识点】
(1)判断是否开启用户通知权限:
// 判断是否开启 允许通知
NotificationManagerCompat manager = NotificationManagerCompat.from(StarbabaApplication.getInstance().getContext());
// true: 开启
boolean isOpened = manager.areNotificationsEnabled();
(2)判断锁屏通知权限是否开启:
KeyguardManager km = (KeyguardManager) mContext.getSystemService(Context.KEYGUARD_SERVICE);
// true: 开启
boolean isScreenOff = km.inKeyguardRestrictedInputMode(); // 是否锁屏
(3)自定义布局RemoteViews:
views = new RemoteViews(mContext.getPackageName(), R.layout.view_notification_routine);
// 设置对应的属性值 (文本)
views.setTextViewText(R.id.tv_appname_routine, BuildConfig.APP_NAME);
// 设置图片(法1)
views.setImageViewBitmap(R.id.iv_pic_routine,bitmap);
// 设置图片(法2)
views.setImageViewBitmap(R.id.iv_pic,BitmapFactory.decodeResource(mContext.getResour ces(), R.drawable.launch_logo));
views.setTextViewText(R.id.tv_title_routine, messageInfo.getTitle());
views.setViewPadding(R.id.tv_title_routine, 0, 5, 0, 0); // 设置间距
views.setTextViewText(R.id.tv_content_routine, messageInfo.getContent());
//views.setViewPadding(R.id.tv_content_routine, 0, -5, 0, 0); // 设置间距
views.setTextViewTextSize(R.id.tv_title, 1, 14); // 设置字体大小
views.setTextViewTextSize(R.id.tv_content, 1, 12);
(4)动态修改 推送logo
【依赖包】 compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
// 一定要先将图片下载下来,再设置上去。
ImageLoader
.getInstance()
.loadImage(messageInfo.getIconUrl(), new ImageLoadingListener() {
@Override
public void onLoadingStarted(String imageUri, View view) {
}
@Override
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
}
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
// imageUri 为图片链接,loadedImage
loadLogo(loadedImage, messageInfo, isNormalStyle);
}
@Override
public void onLoadingCancelled(String imageUri, View view) {
}
});
(5)自定义通知:
resources = mContext.getResources();
notificationManager = (NotificationManager) mContext
.getSystemService(Context.NOTIFICATION_SERVICE);
Intent intent = new Intent();
intent.setAction(IPushConsts.Action.ACTION_HANDLE_MESSAGE);
intent.setClass(mContext, MainService.class);
intent.addCategory(IPushConsts.Category.CATEGORY_PUSH);
intent.setData(Uri.parse("push://"
+ String.valueOf(System.currentTimeMillis())
+ messageInfo.getId()));
intent.putExtra(IPushConsts.Key.KEY_HANDLE_MESSAGE_INFO, messageInfo);
pendingIntent = PendingIntent.getService(mContext, 0,
intent, PendingIntent.FLAG_UPDATE_CURRENT);
// 【注】NotificationCompat.Builder 向下兼容老版本 ,Notification 就没有。
Notification notification = new NotificationCompat.Builder(mContext)
// 不可以不设置这个属性setSmallIcon
.setSmallIcon(R.drawable.vest_yunhuahua_logo) // 消息logo
.setAutoCancel(true)
.setTicker(resources
.getString(“你收到一条新消息了”) // 收到消息的提提示
.setContentTitle(messageInfo.getTitle()) //标题
.setContentText(messageInfo.getContent()) // 内容
// 自定义布局(优点: 可以改变字体样式)
// .setCustomContentView(views)
.setContentIntent(pendingIntent) // 设置 消息点击跳转处理
.setDefaults(Notification.DEFAULT_ALL) // 包括 震动,闪光灯
.getNotification();
notificationManager
.notify(TAG, (int) messageInfo.getId(), notification);
(6)动态改变 自定义布局字体样式,例如加粗, 颜色:
// 目前只发现 这种原始Html样式可以解析 "恭喜你获得<strong><font color=#ff0000>2000<font/></strong>信用额度"
views.setTextViewText(R.id.tv_title, Html.fromHtml(messageInfo.getTitle()));
【重点】能否监听推送消息被移除?
【答案】可以!!!
【实现】
(1)创建移除Intent:
Intent intentCancel = new Intent(this, NotificationBroadcastReceiver.class);
intentCancel.setAction("notification_cancelled");
intentCancel.putExtra(NotificationBroadcastReceiver.TYPE, type);
PendingIntent pendingIntentCancel = PendingIntent.getBroadcast(this, 0, intentCancel, PendingIntent.FLAG_ONE_SHOT);
(2) 使用 setDeleteIntent(pendingIntentCancel)方法:
Notification notification = new NotificationCompat.Builder(mContext)
// 不可以不设置这个属性setSmallIcon
.setSmallIcon(R.drawable.vest_yunhuahua_logo) // 消息logo
.setAutoCancel(true)
.setTicker(resources
.getString(“你收到一条新消息了”) // 收到消息的提提示
.setContentTitle(messageInfo.getTitle()) //标题
.setContentText(messageInfo.getContent()) // 内容
// 自定义布局(优点: 可以改变字体样式)
// .setCustomContentView(views)
.setDeleteIntent(pendingIntentCancel); // 设置消息移除
.setDefaults(Notification.DEFAULT_ALL) // 包括 震动,闪光灯
.getNotification();
(3)broadcastReceiver 消息移除接收器:
public class NotificationBroadcastReceiver extends BroadcastReceiver {
public static final String TYPE = "type"; //这个type是为了Notification更新信息的,这个不明白的朋友可以去搜搜,很多
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
int type = intent.getIntExtra(TYPE, -1);
if (type != -1) {
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
// 移除对应某一个消息
notificationManager.cancel(type);
}
if (action.equals("notification_clicked")) {
//处理点击事件
}
if (action.equals("notification_cancelled")) {
//处理滑动清除和点击删除事件
}
}
}
(4) 注意 需要在 Manifest 注册 广播接收者。
【扩展】 这个试了一下没起作用,不清楚为什么!!!
https://blog.csdn.net/liao277218962/article/details/50774675
网友评论