uniapp点击通知android,分享uniapp使用原生Android推送消息(内推)以及点击通知监听数据...

前言

由于用uniapp官方的plus.push.createMessage()在Android平台下推送通知无法显示推送时间,需要调用原生Android推送通知。

在社区综合了各大神的代码,具体如下:

推送

推送事件:

/**

* android原生通知发送

* @param content 通知内容

* @param data json对象,存储通知的隐藏数据,用于点击通知时接收使用

*/

android_notify(content = '', data = {}) {

// #ifdef APP-PLUS

var title = '通知标题';

console.log('准备通知');

console.log(plus.os.name);

//Android平台下才使用此推送

if (plus.os.name != 'Android') {

return false;

}

//随机生成通知ID

var NotifyID = Math.floor(Math.random() * 10000) + 1;

var main = plus.android.runtimeMainActivity();

var Context = plus.android.importClass("android.content.Context");

var NotificationManager = plus.android.importClass("android.app.NotificationManager");

var nm = main.getSystemService(Context.NOTIFICATION_SERVICE);

var Notification = plus.android.importClass("android.app.Notification");

var Intent = plus.android.importClass("android.content.Intent");

var PendingIntent = plus.android.importClass("android.app.PendingIntent");

var intent = new Intent(main, main.getClass());

//传递参数

var payload = {

'msg':content,

'notify_id':NotifyID,

'data':data

};

intent.putExtra("receive", JSON.stringify(payload));

//PendingIntent.getActivity的第二个参数需要设置为随机数,否则多个通知时会导致前面的通知被后面的通知替换Extra的数据

var pendingIntent = PendingIntent.getActivity(main, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);

var SystemVersion = plus.os.version;

var firstVersionNumber = Number(SystemVersion.split('.')[0]);

var r = plus.android.importClass("android.R");

var mNotification;

//判断当前系统版本在8.0及以上

if (firstVersionNumber >= 8){

var NotificationChannel = plus.android.importClass('android.app.NotificationChannel');

var channel = new NotificationChannel("s"+ NotifyID, "1", NotificationManager.IMPORTANCE_HIGH);

nm.createNotificationChannel(channel);

Notification = plus.android.importClass("android.support.v4.app.NotificationCompat");

mNotification = new Notification.Builder(main, "s" + NotifyID);

} else {

Notification = plus.android.importClass("android.app.Notification");

mNotification = new Notification.Builder(main);

}

mNotification.setContentTitle(title) //设置标题

mNotification.setContentText(content); //设置内容

//mNotification.setSubText(''); //子内容暂时去掉

mNotification.setAutoCancel(true); //设置点击消失

mNotification.setShowWhen(true); //显示通知时间,貌似不加这句也能显示

mNotification.setTicker("PadInfo"); //弹出通知

mNotification.setSmallIcon(17301620); //设置当前app图标

//mNotification.setDefaults(Notification.DEFAULT_VIBRATE); //声音、闪灯、震动效果,可叠加,此语句无效

mNotification.setPriority(Notification.PRIORITY_DEFAULT); //通知优先级

mNotification.flags=Notification.FLAG_ONLY_ALERT_ONCE; //发起通知时震动

mNotification.setContentIntent(pendingIntent);

var mNb = mNotification.build();

//判断当前系统版本在8.0及以上

if (firstVersionNumber >= 8){

nm.notify("s" + NotifyID, NotifyID, mNb);

} else {

nm.notify(NotifyID, mNb);

}

//void plus.device.beep(2);//bee bee叫

plus.device.vibrate(300);//震动

console.log('通知结束');

return true;

// #endif

}

调用方法:

android_notify('test', {

params1: 'params1',

params2: 'params2',

params3: 'params3',

params4: 'params4'

});

接收

点击通知接收通知数据

/**

* android原生通知接收

*/

android_receive() {

// #ifdef APP-PLUS

if (plus.os.name != 'Android') {

return false;

}

//android原生通知栏接收器(程序退出后无效)

var main = plus.android.runtimeMainActivity();

var intent = main.getIntent();

var message = intent && intent.getExtra != undefined ? intent.getExtra("receive") : null;

console.log(message);

message = message ? JSON.parse(message) : '';

if (message) {

//删除当前通知

// var Context = plus.android.importClass("android.content.Context");

// var nm = main.getSystemService(Context.NOTIFICATION_SERVICE);

// console.log(message.notify_id);

//nm.cancel('s' + message.notify_id, message.notify_id);//安卓版本大于等于8的

//nm.cancel(message.notify_id);//安卓版本小于8的

// nm.cancelAll();

//把消息数据置空,以免再次打开APP时重复执行此处

intent.putExtra("receive", '');

var params = message.data;

if (params1 == 'xxx') {

//TODO do something.

} else if (params1 == 'yyy') {

//TODO do something.

}

}

// #endif

}

调用方法

// App.Vue

onShow: function() {

...

// #ifdef APP-PLUS

android_receive();

// #endif

...

},

注意事项

已知问题:第一次通知会有通知延迟现象,大概2-3秒后才会收到通知,之后就不会了(官方的推送没有此问题);

程序被关闭后点击通知消息无法再接收到通知的数据(暂时没有好的解决方案,如果大家有好的方法,欢迎回复分享);

希望能帮助大家。

2020年4月3日补充:

多行显示通知消息//创建大文本样式

var bigTextStyle = plus.android.importClass("android.support.v4.app.NotificationCompat$BigTextStyle");

var style = new bigTextStyle();

style.setBigContentTitle(title);

// style.setSummaryText("备注一行");

style.bigText(content);//这里可以设置超长的文本

mNotification.setStyle(style); //设置大文本样式

以上代码放到var mNb = mNotification.build();之前即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值