AutoJs6

- Overview - 综述
- About - 关于文档
- Progress - 文档部署进度
- Changelog - 文档更新日志

- Manual - AutoJs6 使用手册
- Q & A - 疑难解答

- Global - 全局对象
- Automator - 自动化
- AutoJs6 - 本体应用
- App - 通用应用
- Color - 颜色
- Image - 图像
- OCR - 光学字符识别
- Barcode - 条码
- QR Code - 二维码
- Keys - 按键
- Device - 设备
- Storage - 储存
- File - 文件
- Engine - 引擎
- Task - 任务
- Module - 模块
- Plugins - 插件
- Toast - 消息浮动框
- Notice - 消息通知
- Console - 控制台
- Shell
- Shizuku
- Media - 多媒体
- Sensor - 传感器
- Recorder - 记录器
- Timer - 定时器
- Thread - 线程
- Continuation - 协程
- Event - 事件监听
- Dialog - 对话框
- Floaty - 悬浮窗
- Canvas - 画布
- UI - 用户界面
- Web - 万维网
- HTTP
- Base64
- Crypto - 密文
- Internationalization - 国际化
- Standardization - 标准化
- E4X

- UiSelector - 选择器
- UiObject - 控件节点
- UiObjectCollection - 控件集合
- UiObjectActions - 控件节点行为
- WebSocket
- EventEmitter - 事件发射器
- ImageWrapper - 包装图像类
- App - 应用枚举类
- Color - 颜色类
- Version - 版本工具类
- Polyfill - 代码填泥
- Arrayx - Array 扩展
- Numberx - Number 扩展
- Mathx - Math 扩展

- Exceptions - 异常
- Intent - 意图
- Runtime - 运行时
- Context - 上下文
- Activity - 活动

- Scripting Java - 脚本化 Java
- Android API Level - 安卓 API 级别
- Color Table - 颜色列表

- Glossaries - 术语
- HttpHeader - HTTP 标头
- HttpRequestMethods - HTTP 请求方法
- MimeType - MIME 类型
- NotificationChannel - 通知渠道

- Data Types - 数据类型
- Omnipotent Types - 全能类型
- Storage - 存储类
- AndroidBundle
- AndroidRect
- CryptoCipherOptions
- CryptoKey
- CryptoKeyPair
- ConsoleBuildOptions
- HttpRequestBuilderOptions
- HttpRequestHeaders
- HttpResponseBody
- HttpResponseHeaders
- HttpResponse
- InjectableWebClient
- InjectableWebView
- NoticeOptions
- NoticeChannelOptions
- NoticePresetConfiguration
- NoticeBuilder
- Okhttp3HttpUrl
- OcrOptions
- Okhttp3Request
- OpencvPoint
- OpencvRect
- OpencvSize

- GitHub - 应用项目地址
- GitHub - 文档项目地址

# NoticeBuilder#

androidx.core.app.NotificationCompat.Builder 别名.

NoticeBuilder 表示一个通知构建器.

常见相关方法或属性:

- notice.getBuilder

> 注: 本章节仅列出部分属性或方法.

androidx.core.app.NotificationCompat.Builder

## [m] setAutoCancel#

### setAutoCancel(autoCancel)#

- autoCancel { boolean }
- returns { NoticeBuilder }

配置用户点击通知后是否自动移除通知.

## [m] setChannelId#

### setChannelId(channelId)#

- channelId { string }
- returns { NoticeBuilder }

设定通知渠道 ID.

## [m] setColor#

### setColor(argb)#

- argb { ColorInt }
- returns { NoticeBuilder }

设定通知的 `强调色 (Accent Color)`.

此颜色将应用于通知 `标头图像 (Header Image)` 的着色, 而不会改变通知字体颜色或通知背景颜色等.

    notice(notice.getBuilder()
        .setContentText('hello')
        .setColor(Color('dark-orange').toInt()));

## [m] setContentTitle#

### setContentTitle(title)#

- title { string }
- returns { NoticeBuilder }

设定通知的文本标题.

## [m] setContentText#

### setContentText(text)#

- text { string }
- returns { NoticeBuilder }

设定通知的文本内容.

## [m] setOnGoing#

### setOnGoing(ongoing)#

- ongoing { boolean }
- returns { NoticeBuilder }

设定通知为 "正在进行中" 状态.

正在进行中, 意味着通知关联着一个用户正在参与的后台任务, 如 [ 播放音乐 / 下载任务 / 文件同步操作 / 网络连接激活 ] 等.
这样的通知不能被用户消除 (如左右滑动), 只能通过 notice.cancel 或 NoticeBuilder#setAutoCancel 等方式消除.

## [m] setProgress#

### setProgress(max, progress, indeterminate)#

- max { number } - 进度最大值
- progress { number } - 当前进度值
- indeterminate { boolean } - 是否为不确定进度条
- returns { NoticeBuilder }

设定通知条目的进度值及样式 (以 ProgressBar 控件呈现).

    let notificationId = 12;
    let progress = 0;
    let progressMax = 100;

    let builder = notice.getBuilder()
        .setSilent(true)
        .setContentTitle('正在下载应用');

    while (progress < progressMax) {
        builder
            .setProgress(progressMax, progress, false)
            .setContentText(`已完成 ${progress}%`);
        notice(builder, { notificationId });
        sleep(50);
        progress += Mathx.randInt(1, 4);
    }
    builder
        .setContentText(`已完成 ${progressMax}%`)
        .setContentTitle('下载完成')
    notice(builder, { notificationId });

## [m] setSmallIcon#

### setSmallIcon(icon)#

`Overload 1/2`

- icon { number } - Drawable (可绘制) 资源 ID
- returns { NoticeBuilder }

设定通知的小图标.

`icon` 参数需对应内置的 Drawable 资源, 使用 R.drawable 可获取 AutoJs6 的 Drawable (可绘制) 资源 ID:

    /* 设定通知的小图标为闹钟图标. */
    notice(notice.getBuilder()
        .setSmallIcon(R.drawable.ic_access_alarm_black_48dp)
        .setContentTitle('小图标测试')
        .setContentText('闹钟图标'));

### setSmallIcon(iconCompat)#

`Overload 2/2`

- iconCompat { IconCompat }
- returns { NoticeBuilder }

设定通知的小图标.

`iconCompat` 参数为 IconCompat 类型, 是对 Icon 类型的浅层封装, 支持 `createFromIcon` / `createWithBitmap` / `createWithContentUri` 等静态方法直接创建 `IconCompat` 实例.

    const IconCompat = androidx.core.graphics.drawable.IconCompat;
    let img = images.read('./test.png').oneShot();
    notice(notice.getBuilder()
        .setSmallIcon(IconCompat.createWithBitmap(img.bitmap))
        .setContentTitle('小图标测试')
        .setContentText('从本地文件加载图标'));
    img.shoot();

## [m] setStyle#

### setStyle(style)#

- style { NotificationCompat.Style } - 通知样式类型对象
- returns { NoticeBuilder }

设定通知的风格样式.

部分常用样式模板类:

- NotificationCompat.BigPictureStyle
- NotificationCompat.BigTextStyle
- NotificationCompat.InboxStyle
- NotificationCompat.MessagingStyle
- ... ...

#### BigTextStyle#

大量文本内容通知样式.

    let builder = notice.getBuilder();
    let text = Array(6).fill('This is a long text for test.').join('\n');
    let bigTextStyle = new NotificationCompat.BigTextStyle().bigText(text);
    notice(builder.setStyle(bigTextStyle));

NoticeOptions#bigContent 接口属性, 其内部实现就使用了 BigTextStyle 样式模板类.

> 参阅: Android Docs

#### MessagingStyle#

对话通知样式.

显示任意人数之间依序发送的消息, 类似即时通讯.

    let getTimestamp = (/* @IIFE */ () => {
        let ts = Date.now();
        return () => ts += 1e3;
    })();
    let getPerson = function (name) {
        return new androidx.core.app.Person.Builder().setName(name).build();
    };
    let person = {
        maxwell: getPerson('Maxwell Adam'),
        john: getPerson('John Smith'),
        willilam: getPerson('William Wallace'),
    };

    let notificationId = 16;
    let builder = notice.getBuilder();
    let messagingStyle = new NotificationCompat.MessagingStyle('some_people')
        .setConversationTitle('活动安排')
        .addMessage('周五上午集合吗?', getTimestamp(), person.maxwell)
        .addMessage('应该是周六', getTimestamp(), person.john)
        .addMessage('我查一下备忘录', getTimestamp(), person.john);

    notice(builder.setStyle(messagingStyle), { notificationId });

    void /* argsList */ [
        [ '没错, 是周六上午', getTimestamp(), person.willilam ],
        [ '好的多谢, 后天见', getTimestamp(), person.maxwell ],
        [ '不客气', getTimestamp(), person.willilam ],
        [ '后天见', getTimestamp(), person.willilam ],
        [ 'OK', getTimestamp(), person.john ],
        [ '别忘了带上单反', getTimestamp(), person.john ],
        [ '没问题', getTimestamp(), person.willilam ],
    ].forEach((args) => {
        sleep(2e3, '±500');
        messagingStyle.addMessage.apply(messagingStyle, args);
        builder
            .setStyle(messagingStyle)
            .setSilent(true);
        notice(builder, { notificationId });
    });

> 参阅: Android Docs

#### BigPictureStyle#

大尺寸图片通知样式.

    const FileProvider = androidx.core.content.FileProvider;
    const AppFileProvider = org.autojs.autojs.external.fileprovider.AppFileProvider;
    const MimeTypesUtils = org.autojs.autojs.util.MimeTypesUtils;

    let notificationId = 17;
    let builder = notice.getBuilder();
    let imagePath = files.path('./test.png');
    let albumArtImg = images.read(imagePath).oneShot();

    let bigPictureStyle = new NotificationCompat.BigPictureStyle()
        .bigPicture(albumArtImg.bitmap)
        .setBigContentTitle('Title')
        .setSummaryText('This is a big picture for test')
        .showBigPictureWhenCollapsed(true);

    let pendingIntent = (/* @IIFE */ () => {
        let fileUri = FileProvider.getUriForFile(context, AppFileProvider.AUTHORITY, new File(imagePath));

        let mimeType = MimeTypesUtils.fromFileOr(imagePath, "*/*");

        let intent = new Intent(Intent.ACTION_VIEW)
            .setDataAndType(fileUri, mimeType)
            .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
            .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
            .addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

        return PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_IMMUTABLE);
    })();

    builder
        .setContentText('A big picture')
        .setStyle(bigPictureStyle)
        .setContentIntent(pendingIntent)
        .setAutoCancel(true);

    notice(builder, { notificationId });

    albumArtImg.shoot();

> 参阅: Android Docs

#### InboxStyle#

收件箱通知样式.

按行显示通知内容, 支持使用 `addMessage` 添加新的消息条目, 每个通知最多容纳 5-7 个 (取决于操作系统及屏幕分辨率), 超过此容量的条目将不会被显示.

    let notificationId = 20;
    let style = new NotificationCompat.InboxStyle()
        .addLine('消息片段 A')
        .addLine('消息片段 B')
        .addLine('消息片段 C');
    let builder = notice.getBuilder()
        .setContentTitle('新消息')
        .setContentText('新的收件箱消息')
        .setStyle(style
            .setBigContentTitle('收件箱消息')
            .setSummaryText('消息数量 3'));
    notice(builder, { notificationId });

    sleep(2e3);

    style.addLine('消息片段 D').setSummaryText('消息数量 4');
    notice(builder.setSilent(true), { notificationId });

    sleep(2e3);

    style.addLine('消息片段 E').setSummaryText('消息数量 5');
    notice(builder.setSilent(true), { notificationId });

    sleep(2e3);

    style.addLine('消息片段 F')
        .addLine('消息片段 G')
        .addLine('消息片段 H')
        .setSummaryText('消息数量 5+');
    notice(builder.setSilent(true), { notificationId });

> 参阅: Android Docs

## [m] setTimeoutAfter#

### setTimeoutAfter(duration)#

- duration { number } - 超时时间 (毫秒)
- returns { NoticeBuilder }

指定通知自动消除的超时时间 (毫秒).

    notice(notice.getBuilder()
        .setContentTitle('通知测试')
        .setContentText('通知于 3 秒后自动消除')
        .setTimeoutAfter(3e3));

## [m] setUsesChronometer#

### setUsesChronometer(b)#

- b { boolean } - 是否使用通知计时秒表
- returns { NoticeBuilder }

设置是否使用通知计时秒表.

参数 `b` 设为 `true` 时, 通知时间区域将显示为自动刷新的计时秒表, 每秒钟自动刷新时间.

计时秒表通常用于表明通知的持续显示时间, 可应用于通话计时等场景:

    notice(notice.getBuilder()
        .setContentTitle('通知测试')
        .setContentText('通知计时测试')
        .setUsesChronometer(true));

> 注:
> chronometer [krəˈnɒmɪtə(r)]
> _n._ 精密记时表; 高度精确的钟表

## [m] setChronometerCountDown#

### setChronometerCountDown(countDown)#

- countDown { boolean }
- returns { NoticeBuilder }

设置通知计时区域的时间为倒计时而非正计时.

`setChronometerCountDown` 仅在 setUsesChronometer 设置为 `true` 时才有效.

    /* 在通知的计时区域显示 10 秒钟倒计时. */
    notice(notice.getBuilder()
        .setUsesChronometer(true)
        .setChronometerCountDown(true)
        .setShowWhen(true)
        .setWhen(Date.now() + 10e3)
    );

> 注:
> chronometer [krəˈnɒmɪtə(r)]
> _n._ 精密记时表; 高度精确的钟表

## [m] setWhen#

### setWhen(when)#

- when { number } - 时间戳 (毫秒)
- returns { NoticeBuilder }

添加一个通知时间戳 (毫秒), 用以表示通知发生 (或即将发生) 的具体时间.

使用 `setWhen` 时, 需要设置 setShowWhen 为 `true`, 否则将无法显示时间消息.

    notice(notice.getBuilder()
        .setContentTitle('通知测试')
        .setContentText('通知时间测试 (过去 5 分钟)')
        .setWhen(Date.now() - 5 * 60e3)
        .setShowWhen(true));

    notice(notice.getBuilder()
        .setContentTitle('通知测试')
        .setContentText('通知时间测试 (未来 2 分钟)')
        .setWhen(Date.now() + 128e3)
        .setShowWhen(true));

## [m] setShowWhen#

### setShowWhen(show)#

- show { boolean } - 是否显示时间戳信息
- returns { NoticeBuilder }

设置通知消息是否显示使用 setWhen 设置的时间戳信息.

当 `setShowWhen` 设置为 `false` 时, setWhen 设置的时间戳信息将不再显示在通知消息中.