背景
项目中使用本地通知插件时遇到了很多问题,所以为了更好的解决问题,我将插件的核心源代码逻辑看了一遍,马上就清晰了很多。现在将梳理的内容同大家分享 分享的源码主要包括两个部分:
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函数来响应全局的监听。那么这样就会执行前端的全局监听的回调函数中代码。回调函数即跳转到相应的消息详情页面。
|