Android通知栏点击事件

  最近在做一个混合开发项目,给本地通知栏发送消息,并且在点击通知栏时不去跳转到某一activity界面,而是通过cordova调用js事件。

大致可将这个问题分成三个部分来解决:

1.给本地通知栏发送消息
2.获取通知栏点击事件
3.通过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就不细说了,与本文无关,有兴趣的同学可以去网上学习一下混合开发!

你可能感兴趣的:(Android通知栏点击事件)