最近在做一个混合开发项目,给本地通知栏发送消息,并且在点击通知栏时不去跳转到某一activity界面,而是通过cordova调用js事件。
大致可将这个问题分成三个部分来解决:
一、首先是给本地通知栏发送消息,此部分比较简单,直接上代码。
public void createNotification(Context ctx, PendingIntent intent, int id) {
NotificationManager nm = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = null;
//有两种方式来创建notification
//一
notification = new Notification(icon, title, id);
notification.setLatestEventInfo(ctx, title, content,intent);
//二
Notification.Builder builder = new Notification.Builder(ctx);
builder.setContentText("title"); // 下拉通知栏内容
builder.setContentTitle("content");// 下拉通知栏标题
builder.setSmallIcon(icon);//通知栏图标
builder.setAutoCancel(true);
builder.setContentIntent(intent);
notification = builder.build();
nm.notify(id, notification);
}
二、获取通知栏的点击事件,这里是本文的重点。
上面的代码大家应该能注意到,notification创建时需要传入一个PendingIntent类型的参数,这个参数就是用来处理点击通知之后的动作。与一般intent不同,PendingIntent是指在某条件适当的时机执行的动作,而不是立即执行。
PendingIntent当中有一个方法getBroadcast(),可以向外发出广播,因此我们可以借助该方法,在点击通知栏时发出广播并在onreceiver方法中处理相应逻辑
class MyReceiver extends BroadcastReceiver{
public void onReceive(Context context, Intent intent) {
//处理相应逻辑
}
}
public void buildAction(Context ctx,Intent intent) {
int id = (int)System.currentTimeMillis() / 10000;
//这个getbroadcast方法和创建notifycation时都会用到一个id标示,一般都是统一的,但是我用不同值试过也是可以的
PendingIntent clickIntent = PendingIntent.getBroadcast(ctx, id,intent, PendingIntent.FLAG_UPDATE_CURRENT);
createNotification(ctx,clickIntent,id);
}
接下来就是将广播放入PendingIntent当中了,同时还要注册广播,最开始我的写法时参照网上的写法:
IntentFilter filter = new IntentFilter();
filter.addAction(MY_ACTION);
args.getUMActivity().registerReceiver(new MyReceiver(), filter);
Intent intent = new Intent(ctx, MyReceiver.class);
intent.setAction(MY_ACTION);
发现这样写无法触发广播,只能静态注册,网上查了半天也没有结果。后来一想既然调用了setAction方法注册了动作,并且有了intentfilter,为什么还要写一个new Intent(ctx,MyReceiver.class);这不是画蛇添足吗,之后改成如下方式:
public void run() {
IntentFilter filter = new IntentFilter(MY_ACTION);
args.getUMActivity().registerReceiver(new UMNotificationClickReceiver(), filter);
Intent intent = new Intent(MY_ACTION);
buildAction(this,intent);
}
一运行,哈哈,OK
第三部分用cordova调用js就不细说了,与本文无关,有兴趣的同学可以去网上学习一下混合开发!