ItsPaster
ItsPaster
  • 发布:2015-01-15 09:06
  • 更新:4 天前
  • 阅读:19943

[20180607已更新] 使用NJS控制Android通知栏,不用个推实现本地消息推送(Local Notification)

分类:Native.js
2015-01-15 09:06 1 条评论 分享
已邀请:

最佳回复

ItsPaster

ItsPaster (作者)

@DCloud_App_Array 這個示例代码分享給大家

這個問題就自行回答了 :P

HTML5+ API 的推送,請參考 Push模块管理推送消息功能
Dcloud也集成了個推的功能,請參考 推送插件配置推送插件开发指南

而原生的文檔,請參考谷歌的 NotificationNotification.BuilderNotificationManager

代碼如下,效果比較接近5+ 的Push

var NotifyID = 1;  
var Context = plus.android.importClass("android.content.Context");  
var main = plus.android.runtimeMainActivity();  
var Noti = plus.android.importClass("android.app.Notification");  
var NotificationManager = plus.android.importClass("android.app.NotificationManager");  
var nm = main.getSystemService(Context.NOTIFICATION_SERVICE)  
var Notification = plus.android.importClass("android.app.Notification");  
var mNotification = new Notification.Builder(main);  
mNotification.setOngoing(true);  
mNotification.setContentTitle("Hbuilder")  
mNotification.setContentText("MUI & 5+ 大好!")  
mNotification.setSmallIcon(17301620)  
mNotification.setTicker("PadInfo")  

mNotification.setNumber(10)  
var mNb = mNotification.build()  
nm.notify(NotifyID , mNb);  

實際效果:

這個可以直接實現本地推送,固定在通知栏。
如果要可以从通知栏刪掉的,請去除掉 mNotification.setOngoing(true) 這行代碼即可

  • ItsPaster (作者)

    目前setongoing()已經正常了,可以固定在通知欄上了!

    2015-02-11 16:36

  • 撒网要见鱼

    mNotification.build() 只有api 版本大于16才能使用吧! 我 4.0.4的机子不能使用.回报错:

    Object android.app.Notification$Builder@41edcbc0 has no method 'build'

    2016-01-06 10:06

  • ItsPaster (作者)

    @124332 您可以在找找原生代码看看!

    2016-01-10 11:20

  • 撒网要见鱼

    额,我已经自行通过原生代码解决了。以下是我得代码,也分享出来

    地址:http://ask.dcloud.net.cn/article/503

    2016-01-10 17:09

  • ItsPaster (作者)

    太好了,谢谢您分享

    2016-01-10 17:11

  • 成都H5

    看你这个只有安卓 ios没有

    2017-07-27 15:00

  • ItsPaster (作者)

    @105144 对,我这个只实现安卓

    2017-07-27 17:48

ItsPaster

ItsPaster (作者)

引用 @810726685@qq.com 提供之代码,可以实现点击后回到应用当前页
另外,setSmallIcon的部分提供android.R.drawable使用,可查询其API可以得到相关常数。

默认图标请在manifest.json 配置后进行打包就行!

var NotifyID = 1;  
var main = plus.android.runtimeMainActivity();  
var Context = plus.android.importClass("android.content.Context");  
var Noti = plus.android.importClass("android.app.Notification");  
var NotificationManager = plus.android.importClass("android.app.NotificationManager");  
var nm = main.getSystemService(Context.NOTIFICATION_SERVICE)  
var Notification = plus.android.importClass("android.app.Notification");  
var mNotification = new Notification.Builder(main);  
// 新增 810726685@qq.com 的代码  
var Intent = plus.android.importClass("android.content.Intent");  
var PendingIntent = plus.android.importClass("android.app.PendingIntent");  
var intent = new Intent(main, main.getClass());  
var pendingIntent = PendingIntent.getActivity(main, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);  
// 新增代码  
var r = plus.android.importClass("android.R");  

mNotification.setOngoing(true);  
mNotification.setContentTitle("Hbuilder")  
mNotification.setContentText("MUI & 5+ 好!")  

// 新增代码  
mNotification.setSmallIcon(r.drawable.ic_notification_overlay)  
mNotification.setTicker("PadInfo")  

// 新增 810726685@qq.com 的代码  
mNotification.setContentIntent(pendingIntent);  
mNotification.setNumber(10)  
var mNb = mNotification.build()  
nm.notify(NotifyID, mNb);  
  • 76901932@qq.com

    大神,能不能类似qq、微信那样的悬挂式通知

    2018-09-12 20:01

Aimo

Aimo

setSmallIcon里的值我怎么得到呢

  • ItsPaster (作者)

    這個部分還在研究,如果有需要的話 可以先問DCL的大神們

    2015-02-11 16:32

  • 清风一刀

    系统图标在android.jar中R.drawable有对应的常量,但android版本不一样,值也不一样

    2015-08-14 10:46

  • ItsPaster (作者)

    请看最新回复

    2018-06-07 15:25

2323646018

2323646018

消息出来后删不掉啊

  • ItsPaster (作者)

    您好 這個就是固定的本地推送

    如果你要可以刪掉的

    請去除掉 mNotification.setOngoing(true) 這行代碼即可

    2015-05-04 16:00

  • 2323646018

    厉害!!!

    2015-05-09 00:41

dotdot

dotdot

点击消息框后,如何返回原来的程序?

  • ItsPaster (作者)

    请看最新回复

    2018-06-07 15:24

Danny

Danny - QQ125904483

顺便完善下,提供一整套功能呗:

  1. 利用NJS实现一个Android客户端后台轮询服务,该服务远程获取需呀推送的消息;
  2. 客户端可设置服务轮询周期;
  3. 客户端可设置是否接收推送消息(推送前添加个获取本地配置的判断);
  4. 轮询时获取到需要推送消息是就调用现在你分享的通知栏消息推送。

先行拜谢!

  • ItsPaster (作者)

    我提供固定的本地推送 是讓我們的APP常駐在上方下拉系統列的

    您提的這個功能,可以直接用目前已有的個推。

    2015-05-15 16:53

  • Danny

    回复 ItsPaster:就是不想用个推嘛

    2015-05-15 17:50

  • ItsPaster (作者)

    。。。。。。

    2015-05-18 16:42

  • 1019375003@qq.com

    可以问下。个推只能推送消息。不能轮询服务器嘛。。我找不到轮询后台服务器

    2016-05-14 21:54

  • 1019375003@qq.com

    回复 Danny:额。。这个功能你实现了嘛。可以贴个代码出来吗?先谢谢了

    2016-05-14 21:54

Caven

Caven

这个功能很实用,希望官方考虑加到MUI标准功能库中!

时代风

时代风

支持哦

清风一刀

清风一刀

求自定义图标如何加在这段代码上面哦。有例子给点代码哦。

  • ItsPaster (作者)

    请看最新回复

    2018-06-07 15:24

Laster

Laster - 叽哈哈~~! Hbuilder

请问一下,怎么设置图标,还有怎么才能让用户点击通知进入app

  • ItsPaster (作者)

    请看最新回复

    2018-06-07 15:24

HelloWorld_luo

HelloWorld_luo

请教一下: 这个怎么添加点击事件。(效果::点击过后,跳转到当前应用的某个页面。location.href ="")

  • nsgfr

    是啊,试了好多,都不起作用。。

    2016-07-14 12:50

  • Smile_微笑

    楼主做到了吗 求指教

    2017-03-06 16:55

  • ItsPaster (作者)

    请看最新回复,跳转到应用的某个页面的部分给个思路。应用从背景切换到前景时,在那个时候切换。

    2018-06-07 15:24

dudan

dudan

我写了个IOS的原生创建本地通知,可以正常运行,程序中的日志都能正常打印,但就是一点反应都没有,通知没有显示出来,帮忙看下是什么问题,代码如下:

    /**  
     * IOS原生方法  
     * @param {Object} contentTitle  
     * @param {Object} contentText  
     * @param {Object} smallIcon  
     */  
    function createLocalMessageForIOS(contentTitle, contentText, smallIcon){  
        console.log('ios begin.');  
        var UILocalNotification = plus.ios.importClass("UILocalNotification");  
        // 创建UILocalNotification类的实例对象  
        var localNotification = new UILocalNotification();  
        //设置调用时间  
        var NSDate = plus.ios.importClass('NSDate');  
        var myNSDate = new NSDate();  
        myNSDate.dateWithTimeIntervalSinceNow = 1; //1秒后触发  
        localNotification.fireDate = myNSDate;  
        localNotification.alertBody = contentText;  
        localNotification.applicationIconBadgeNumber = 3;  
        localNotification.alertAction = '打开应用!';  
        localNotification.alertLaunchImage = 'Default';  
        localNotification.soundName = UILocalNotification.DefaultSoundName;  
        var UIApplication = plus.ios.importClass("UIApplication");  
        var myUIApplication = new UIApplication();  
        myUIApplication.scheduleLocalNotification = localNotification;  
        //销毁对象实例  
        plus.ios.deleteObject( localNotification );  
        plus.ios.deleteObject( myUIApplication );  
        plus.ios.deleteObject( myNSDate );  
        console.log('ios end.');  
    }  
  • ItsPaster (作者)

    iOS尚未研究

    2018-06-07 15:23

霸王

霸王

点击通知栏的消息框无法返回到应用啊

  • ItsPaster (作者)

    请看最新回复

    2018-06-07 15:23

无所不帅

无所不帅

这种方式跟plus.push.createMessage本地创建一条推送消息,有什么区别?我想知道如果程序退出,还能不能创建?我想做一个,程序退出照样可以接收推送消息,跟微信一样,除了使用个推的方式意外,还有其他方式吗??我的想法是在程序安装的时候或程序启动的时候,开始两个不同的进程,一个就是本程序的运行,另一个类似于一个服务进程,去负责跟服务器建立连接,这个进程一直在运行,不会因为本程序的结束或退出而结束运行,就跟qq微信似的就有好几个进程。请问这样怎么代码实现。求、、

  • 炸鸡排超人

    这样可以自己写功能了,那个plus的不能

    2017-03-28 11:13

  • 高风

    回复 炸鸡排超人:这个怎么写功能呢 不知道可否给个demo看看呢

    2018-11-14 15:51

mqcmqc@21cn.com

mqcmqc@21cn.com

关键问题有二个,一是如何修改那个图标?二是如何实现点击通知进入 app?

  • ItsPaster (作者)

    请看最新回复

    2018-06-07 15:22

mqcmqc@21cn.com

mqcmqc@21cn.com

看到这么多人问这个问题,但没一个回答的,看来应该是无解咯。。。。

mqcmqc@21cn.com

mqcmqc@21cn.com

如果用push来做,里面有一个PushClickCallback。但这个njs没有吗?

1913983800@qq.com

1913983800@qq.com

想问下setSmallIcon里面的值是怎么来的

  • ItsPaster (作者)

    请看最新回复

    2018-06-07 15:22

810726685@qq.com

810726685@qq.com

我加了一些代码可以实现点击后回到应用当前页,你们是试一下,嘿嘿

NotifyID = NotifyID+1;
var Context = plus.android.importClass("android.content.Context");
var main = plus.android.runtimeMainActivity();
var Intent = plus.android.importClass('android.content.Intent');
var Noti = plus.android.importClass("android.app.Notification");
var NotificationManager = plus.android.importClass("android.app.NotificationManager");
var nm = main.getSystemService(Context.NOTIFICATION_SERVICE)
var PendingIntent = plus.android.importClass('android.app.PendingIntent');
var Notification = plus.android.importClass("android.app.Notification");
var mNotification = new Notification.Builder(main);
var intent = new Intent(main, main.getClass());
var pendingIntent = PendingIntent.getActivity(main, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);

    mNotification.setOngoing(false);  
    mNotification.setContentTitle("我是标题")  
    mNotification.setContentText("我是内容1. ")  
    mNotification.setSmallIcon(17301620)  
    mNotification.setTicker("PadInfo")  
    mNotification.setContentIntent(pendingIntent);  

    mNotification.setNumber(10)  
    var mNb = mNotification.build()  
    nm.notify(NotifyID, mNb);;  
    plus.device.vibrate(1000);
  • Liosixer

    赞! 可是 为毛 官方不给出来!

    2017-12-19 14:23

  • 810726685@qq.com

    现在还不知道怎么改图标.....

    2017-12-20 11:06

  • xiaoqianYang

    请问怎么用njs监听所有通知栏的消息,

    2018-11-12 15:04

  • 高风

    回复 810726685@qq.com:您好 现在知道如何修改图标了吗

    2018-11-14 15:34

ouweican@126.com

ouweican@126.com

谁能教一下怎么替换那个默认图标

FYC

FYC - 80后IT男

学习一下,感谢楼主分享

太2真人

太2真人

关注

郁桦杰

郁桦杰

这个正是我需要的内容。

1139064780@qq.com

1139064780@qq.com

谢谢,很有用!

高风

高风 - 有你有我有阳光

怎样才可以跳转到指定的页面呀

xiaoqianYang

xiaoqianYang

请问怎样才能监听到系统通知栏的所有消息

see7di@gmail.com

see7di@gmail.com - www.7di.net

無他,對代碼進行了一下精簡整理而已

var main = plus.android.runtimeMainActivity();  
var Context = plus.android.importClass('android.content.Context');  
var Notification = plus.android.importClass('android.app.Notification');  
var MyNTF = new Notification.Builder(main);  
var Intent = plus.android.importClass('android.content.Intent');  
var PendingIntent = plus.android.importClass('android.app.PendingIntent');  
var android_R = plus.android.importClass('android.R');  

//MyNTF.setOngoing(true); //是否允許滑動關閉?  
MyNTF.setContentTitle('Hbuilder')  
MyNTF.setContentText('不用个推实现本地消息推送!')  
MyNTF.setSmallIcon(android_R.drawable.ic_notification_overlay)  
MyNTF.setTicker('PadInfo')  
MyNTF.setContentIntent(PendingIntent.getActivity(main,0,new Intent(main, main.getClass()),PendingIntent.FLAG_CANCEL_CURRENT));  
MyNTF.setNumber(10)  
main.getSystemService(Context.NOTIFICATION_SERVICE).notify(1,MyNTF.build());  
363874798@qq.com

363874798@qq.com

想请教下,IOS版如何实现

1591112735@qq.com

1591112735@qq.com - 1591112735@qq.com

怎么调用手机的呼吸灯啊

it_dyh

it_dyh

大佬,常驻状态栏时要如何规避百度定位时 Android 8.0系统对后台定位的限制。

要回复问题请先登录注册