ItsPaster
ItsPaster
  • 发布:2015-01-15 09:06
  • 更新:2020-02-10 00:19
  • 阅读:32007

[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);
  • 7***@qq.com

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


    2018-09-12 20:01

s***@gmail.com

s***@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());
3***@qq.com

3***@qq.com

想请教下,IOS版如何实现

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

  • 1***@qq.com

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


    2016-05-14 21:54

  • 1***@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

神舟

神舟

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

  • ItsPaster (作者)

    请看最新回复


    2018-06-07 15:22

神舟

神舟

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

神舟

神舟

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

1***@qq.com

1***@qq.com

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

  • ItsPaster (作者)

    请看最新回复


    2018-06-07 15:22

8***@qq.com

8***@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

  • 8***@qq.com

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


    2017-12-20 11:06

  • xiaoqianYang

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


    2018-11-12 15:04

  • 高风

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


    2018-11-14 15:34

o***@126.com

o***@126.com

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

  • 王者地带

    你在配置那上传LOGO后, 云打包下来安装就是你的图标了


    2018-03-21 17:28

  • 8***@qq.com

    回复 王者地带:想问下setSmallIcon里面的值是怎么来的


    2018-04-03 15:01

  • 8***@qq.com

    回复 王者地带:我配置logo了打包后也没出来


    2018-04-03 15:01

FYC

FYC - 80后IT男

学习一下,感谢楼主分享

太2真人

太2真人

关注

郁桦杰

郁桦杰

这个正是我需要的内容。

1***@qq.com

1***@qq.com

谢谢,很有用!

高风

高风 - 有你有我有阳光

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

xiaoqianYang

xiaoqianYang

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

1***@qq.com

1***@qq.com - 1591112735@qq.com

怎么调用手机的呼吸灯啊

it_dyh

it_dyh

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

z***@163.com

z***@163.com - 不想做程序的程序媛

你好,想问下安卓中如何实现监听通知栏消息并将消息回调在页面中展示~???

Mark_yu

Mark_yu - 测试

请假大家一下,我手机刚开始试的时候可以弹出消息来,后面怎么都弄不会弹消息了,是手机又限定吗,请问又遇到过这种情况吗?

7***@qq.com

7***@qq.com - 嘿,老头

这个现在是不是用不了的,刚测试都没反应的

菜鸟0120

菜鸟0120

怎么点击通知栏跳转页面啊,有实现的吗给个思路

蚊子腿细也是肉

蚊子腿细也是肉

请问怎么监听点击事件呢?

丁町

丁町 - 丁町的邮箱

setWhen 没有效果啊 ???

5***@qq.com

5***@qq.com

Uncaught ReferenceError: plus is not defined (提示: 请在plus ready后再调用plus api)

该问题目前已经被锁定, 无法添加新回复