Android cordova 本地通知插件源码分析-cordova-plugin-local-notification

背景

项目中使用本地通知插件时遇到了很多问题,所以为了更好的解决问题,我将插件的核心源代码逻辑看了一遍,马上就清晰了很多。现在将梳理的内容同大家分享
分享的源码主要包括两个部分:

1、通知展示到状态栏的代码逻辑
2、点击通知触发的逻辑原理

一、通知展示到状态栏的代码逻辑

scheduel方法源码分析,其他方法类似

1、LocalNotification状态栏显示通知schedule:参数:json 数组,每一个json对象 的key 包装为Options 对象。options对象构建从H5端构建
2、Notification 中的 schedule方法中传入参数 TriggerReceiver 类(广播接收器)
定义intent 组成intents列表:

Intent intent = new Intent(context, receiver)
        .setAction(PREF_KEY_ID + request.getIdentifier())
        .putExtra(Notification.EXTRA_ID, options.getId())
        .putExtra(Request.EXTRA_OCCURRENCE, request.getOccurrence());

ids.add(intent.getAction());
intents.add(new Pair<Date, Intent>(date, intent));

持久化消息ids 目的:持久化消息到Android Shared Preferences. 它允许应用在设备重启、应用重启、检索消息通知之时可以恢复通知
3、如果设定了在某个时间点发送广播,则使用PendingIntent发送广播。通过PendingIntent pi = PendingIntent.getBroadcast(
context, 0, intent, FLAG_CANCEL_CURRENT); 方法来完成发送广播。
如果没有设置时间则直接发送广播
其中广播接收器为TriggerReceiver 。 TriggerReceiver 继承了抽象类AbstractTriggerReceiver,而AbstractTriggerReceiver又继承了BroadcastReceiver
4、发送广播后,广播接收器直接接收广播并进行处理,调用AbstractTriggerReceiver的onReceive方法,此方法除了构建了Notificationbuilder实例外并调用TriggerReceiver中的onTrigger方法,onTrigger方法中执行唤醒app、调用原生的NotificationManager进行消息通知展示。
构建Notificationbuilder时,在TriggeReceiver方法中 调用了

builder
        .setClickActivity(ClickReceiver.class)
        .setClearReceiver(ClearReceiver.class)
        .setExtras(bundle)
        .build(); 

此句将某一个notification赋予了点击事件,并指定了点击事件触发的activity。其真正的实现是在build方法中。在build方法中调用了applyContentReceiver(builder); 方法详细如下:

private void applyContentReceiver(NotificationCompat.Builder builder) {

    if (clickActivity == null)
        return;

    Intent intent = new Intent(context, clickActivity)
            .putExtras(extras)
            .putExtra(Notification.EXTRA_ID, options.getId())
            .putExtra(Action.EXTRA_ID, Action.CLICK_ACTION_ID)
            .putExtra(Options.EXTRA_LAUNCH, options.isLaunchingApp())
            .setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);

    int reqCode = random.nextInt();

    PendingIntent contentIntent = PendingIntent.getActivity(
            context, reqCode, intent, FLAG_UPDATE_CURRENT);

    builder.setContentIntent(contentIntent);
}

可以看到,定义了一个intent指定了跳转类,此相当于从外部应用访问当前应用。并将intent包装为PendingIntent 放到原生NotificationCompat.Builder(Android api提供)的ContentIntent中,等待点击事件发生后进行意图触发。NotificationCompat.Builder是NotificationCompat 对象的生成器类。 允许更轻松地控制所有标志,并帮助构建典型的通知布局。
NotificationCompat.Builder请查看https://developer.android.google.cn/reference/androidx/core/app/NotificationCompat.Builder

上述及为消息到达后如何展示到通知栏上源码分析过程

二、手机状态栏的消息点击事件

cordova本地通知插件提供了如下监听点击事件的方法

window.cordova.plugins.notification.local.on('click', function(notification, eopts) {
         alert('点击了click' + notification)
    })

此方法一般写在app启动时,注册一个全局的监听事件,当有点击事件到达后就会触发回调方法。那么这个点击事件是如何触发的呢?
1、首先,cordova插件提供原生代码,并在AndroidMenifest.xml 清单文件中注册了一个activity的子类ClickReceiver。ClickReceiver继承自AbstractClickReceiver,而AbstractClickReceiver继承了activity类。
2、当消息通知栏的点击事件触发后触发AbstractClickReceiver的oncreate方法。(为什么会触发呢?请阅读上面的第4点说明)。在oncreate方法中拿到消息实例,并判断应用是否启动,如果没有启动则需要启动app。并找到click事件通过sendJavascript函数来响应全局的监听。那么这样就会执行前端的全局监听的回调函数中代码。回调函数即跳转到相应的消息详情页面。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

senda66

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值