- NotificationUtils 类
public class NotificationUtils {
private static final String TAG = "NotificationUtils";
static int i = 0;
private static int id = 1;
public static void setNotification(Context context, String content,String toUserId ) {
// Intent intent = new Intent(Intent.ACTION_MAIN);
// intent.addCategory(Intent.CATEGORY_LAUNCHER);
// intent.setClass(MyApplication.getInstance(), MainActivity.class);
// RxBus.getDefault().post(Constants.NOTIFICATION);
MilierLog.i(TAG,"setNotification***");
Intent intent = new Intent(MyApplication.getInstance(), NotificationClickReceiver.class);
intent.setAction("notification_clicked");
intent.putExtra(NotificationClickReceiver.TYPE, id);
MilierLog.i(TAG,"通知里toUserId is :"+toUserId);
Constants.TO_USER_ID = toUserId;
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
// PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
PendingIntent pendingIntent = PendingIntent.getBroadcast(MyApplication.getInstance(), id++, intent, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE);
Notification.Builder builder = new Notification.Builder(context);
// if (content.equals(context.getString(R.string.newMessage))) {
// builder.setContent(new RemoteViews(context.getPackageName(), R.layout.layout_notification));
// } else {
// builder.setContent(new RemoteViews(context.getPackageName(), R.layout.layout_notification));
// }
builder.setContentIntent(pendingIntent)//设置通知栏点击意图
.setContentTitle(content)
.setTicker(content)
.setWhen(System.currentTimeMillis())//通知产生的时间,会在通知信息里显示,一般是系统获取到的时间
.setAutoCancel(true)//设置这个标志当用户单击面板就可以让通知将自动取消
.setOngoing(false)//ture,设置他为一个正在进行的通知。他们通常是用来表示一个后台任务,用户积极参与(如播放音乐)或以某种方式正在等待,因此占用设备(如一个文件下载,同步操作,主动网络连接)
.setDefaults(Notification.DEFAULT_ALL)//向通知添加声音、闪灯和振动效果的最简单、最一致的方式是使用当前的用户默认设置,使用defaults属性,可以组合
.setSmallIcon(R.mipmap.ic_launcher);//设置通知小ICON
Notification notification = builder.getNotification();
notificationManager.notify(i++, notification);
}
}
重要的两点:
PendingIntent.getBroadcast(MyApplication.getInstance(), id++, intent, PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent.getBroadcast的第四个参数设置于PendingIntent.FLAG_UPDATE_CURRENT
第二个参数区分注册的Intent
2.NotificationClickReceiver 类
public class NotificationClickReceiver extends BroadcastReceiver {
private static final String TAG = "NotificationClickReceiver";
public static final String TYPE = "type";
@Override
public void onReceive(Context context, Intent intent) {
//todo 跳转之前要处理的逻辑
String action = intent.getAction();
int type = intent.getIntExtra(TYPE, -1);
if (type != -1) {
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.cancel(type);
}
MilierLog.i(TAG,"action is :"+action);
if (action.equals("notification_clicked")) {
//处理点击事件
MilierLog.i(TAG,"NotificationClickReceiver***");
// Intent newIntent = new Intent(context, MainActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// context.startActivity(newIntent);
RxBus.getDefault().post(Constants.NOTIFICATION);
}
if (action.equals("notification_cancelled")) {
//处理滑动清除和点击删除事件
}
}
}
- AndroidManifest.xml中注册监听
<receiver android:name=".broadcast.NotificationClickReceiver">
<intent-filter>
<action android:name="notification_cancelled"/>
<action android:name="notification_clicked"/>
</intent-filter>
</receiver>