IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android cordova 本地通知插件源码分析-cordova-plugin-local-notification -> 正文阅读

[移动开发]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函数来响应全局的监听。那么这样就会执行前端的全局监听的回调函数中代码。回调函数即跳转到相应的消息详情页面。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-03-12 17:41:04  更:2022-03-12 17:41:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/1 12:44:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码