本教程分为三个部分:发送通知(自定义图片),通知栏下载进度显示,通知栏nodejs版。实现效果如下图。(代码下载在我的公众号:For My Future对应一文文末)
在写代码之前,首先要把软件通知权限都打开:
在第一次运行代码之后,会出现类别,把类别中的通知权限也给到:
一.发送通知
利用android.app.Notification这个类进行通知的创建,有两个重点:channel和builder,channel设置的是系统如何通知,比如设置通知显示的位置,通知是否震动等等,而通知真正的内容用builder来进行设置创建。
channel(详见代码注释):
var channel = new android.app.NotificationChannel("121695", "1671", android.app.NotificationManager.IMPORTANCE_HIGH);//Android8.0以上的的通知要设置渠道,否则就无法显示,第一个参数是channel_name,第二个参数是channel_id,自己随意设置
channel.enableLights(true);//开启指示灯,如果设备有的话。
channel.setLightColor(0xff0000);//设置指示灯颜色
channel.setShowBadge(true);// 通知渠道是否在应用图标的右上角展示小红点
channel.enableVibration(true);//是否震动
channel.setBypassDnd(true);//绕过免打扰模式
channel.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC)//在锁屏界面显示
channel.setDescription("QQ:1216951671")
// getId() — 获取 ChannleId
// enableLights() — 开启指示灯,如果设备有的话。
// setLightColor() — 设置指示灯颜色
// enableVibration() — 开启震动
// setVibrationPattern() — 设置震动频率
// setImportance() — 设置频道重要性
// getImportance() — 获取频道重要性
// setSound() — 设置声音
// getSound() — 获取声音
// setGroup() — 设置 ChannleGroup
// getGroup() — 得到 ChannleGroup
// setBypassDnd() — 设置绕过免打扰模式
// canBypassDnd() — 检测是否绕过免打扰模式
// getName() — 获取名称
// setLockscreenVisibility() — 设置是否应在锁定屏幕上显示此频道的通知
// getLockscreenVisibility() — 检测是否应在锁定屏幕上显示此频道的通知
// setShowBadge() 设置是否显示角标
// canShowBadge() — 检测是否显示角标
// setImportance 重要程度
随后创建manager管理channel:
var manager = context.getSystemService(android.app.Service.NOTIFICATION_SERVICE); //NotificationManager对象来对通知进行管理
manager.createNotificationChannel(channel);//通过 NotificationManager 的 createNotificationChannel 方法来创建 NotificationChannel
builder:
notification = new android.app.Notification.Builder(context, "121695") //channel_id是自己取得,121695
.setContentTitle("这是我的标题")
.setContentText("QQ:1216951671")
.setWhen(new Date().getTime())//时间毫秒格式
.setSmallIcon(img3)//设置图片,下文会讲述怎么设置
.setSubText(getLocalTime(new Date().getTime()))//毫秒转换时间格式
.setTicker("更多精彩在公众号:For My Future")//第一次推送
.setLargeIcon(largeimg3)
.setDefaults(Notification.DEFAULT_ALL) //打开呼吸灯,声音,震动,触发系统默认行为
.setPriority(Notification.PRIORITY_HIGH) //设置该通知优先
.setAutoCancel(true)
.setContentIntent(//设置点击事件
PendingIntent.getActivity(//点击跳转
context,
0,
new Intent().setComponent(//跳转到qq主界面
new ComponentName("com.tencent.mobileqq", "com.tencent.mobileqq.activity.SplashActivity") ),
PendingIntent.FLAG_UPDATE_CURRENT
)
)
.build();
} else {
toast("没写")
}
使用pro9notify()函数进行通知
manager.notify(1, notification);
自定义图片资源:
setLargeIcon()和setSmallIcon()参数都是icon类型的,如果直接设置图片会报错,所以要把图片先转换为bitmap格式,再转换成Icon类型的图标。
let img = images.read("./logo.png")//图片放在同级目录下
largeimg = images.resize(img,64)//裁剪重设大小
largeimg2 = largeimg.bitmap//转换bitmap
largeimg3 = Icon.createWithBitmap(largeimg2)//转换icon,右侧大图标
img = images.resize(img,36)//左侧小图标
img2 = img.bitmap
img3 = Icon.createWithBitmap(img2)
时间转换:
function getLocalTime(nS) {
var d = new Date(parseInt(nS)); //根据时间戳生成的时间对象
var date = (d.getFullYear()) + "." +
(d.getMonth() + 1) + "." +
(d.getDate()) + " " +
(d.getHours()) + ":" +
(d.getMinutes()) + ":" +
(d.getSeconds());
return date;
}
二.通知栏下载进度显示
经过上网查询,利用DownloadManager是最简单的进度显示方法,这里以下载AutoJsPro的apk为例子。下载完成后文件保存在Download目录下
/**
* 作者: 姜来式
* QQ: 1216951671
*/
var url = "https://cdn.autojs.org/autojspro-latest.apk"
importClass(android.content.Context);
importClass(android.os.Environment);
importClass(android.os.Build);
importClass(android.net.Uri);
importClass(android.app.DownloadManager);
request = new DownloadManager.Request(Uri.parse(url));
request.setDescription("正在下载...🎶");
request.setTitle("AutoJsPro");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
request.allowScanningByMediaScanner();
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
}
// setDestinationUri(Uri uri)设置下载路径
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "AutojsPro.apk");
// get download service and enqueue file
manager = context.getSystemService(Context.DOWNLOAD_SERVICE);
manager.enqueue(request);//加入到下载队列
三.通知栏node.js版
pro9内置notification模块,可进行通知,开发文档地址:
https://pro.autojs.org/docs/v9/zh/modules/notification.html
"nodejs";
//https://pro.autojs.org/docs/v9/zh/modules/notification.html
/**
* 作者: 姜来式
* QQ: 1216951671
*/
const { showToast } = require('toast');
const notification = require('notification');
const app = require('app');
const { setClip } = require('clip_manager');
const notificationId = 121695;
var qq = "1216951671";
notification.notify(notificationId, {
contentTitle: "点击触发一条新通知",
contentText: "这是一条可以被用户清理的通知",
ticker: "状态栏通知",
onDelete: () => {
showToast("退出");
process.exit();
},
onContentClick: () => {
qqjump(); //跳转的qq界面
},
autoCancel: true,
});
const qqid = 1671;
function qqjump() {
notification.notify(qqid, {
contentTitle: "联系作者",
contentText: "点击跳转",
ticker: "收到一条新通知",
silent: true,
onContentClick: () => {
notification.cancel(qqid);
app.startActivity({
action: "android.intent.action.VIEW",
data: "mqqapi://card/show_pslcard?src_type=internal&source=sharecard&version=1&uin=" + qq, // call author
packageName: "com.tencent.mobileqq",
})
},
onDelete: () => {
showToast("退出");
process.exit();
},
actions: [
{
title: "点击按钮复制作者QQ号",
onClick: () => {
setClip(qq);
showToast("已复制到剪贴板")
},
},
],
});
}
$autojs.keepRunning();//全局函数,一直运行
代码下载及更多教程在我的公众号:For My Future