Android通知栏点击事件

来源:互联网 发布:二维数组初始化为空 编辑:程序博客网 时间:2024/06/06 21:39

  最近在做一个混合开发项目,给本地通知栏发送消息,并且在点击通知栏时不去跳转到某一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就不细说了,与本文无关,有兴趣的同学可以去网上学习一下混合开发!

原创粉丝点击