HarmonyOS Sample 之 Notification 通知功能 原创 精华

Buty9147
发布于 2021-8-10 15:52
3377浏览
3收藏

目录

Notification 通知功能

介绍

通知功能,即在一个应用的UI界面之外显示的消息,主要用来提醒用户有来自该应用中的信息。本示例演示了如何发布通知和取消通知,还有如何发布一个带有回复功能的通知。

效果展示

HarmonyOS Sample 之 Notification 通知功能-鸿蒙开发者社区

搭建环境

安装DevEco Studio,详情请参考DevEco Studio下载
设置DevEco Studio开发环境,DevEco Studio开发环境需要依赖于网络环境,需要连接上网络才能确保工具的正常使用,可以根据如下两种情况来配置开发环境:

如果可以直接访问Internet,只需进行下载HarmonyOS SDK操作。
如果网络不能直接访问Internet,需要通过代理服务器才可以访问,请参考配置开发环境
下载源码,导入项目。

实现步骤

1.订阅事件

定义通知事件订阅者

/**
 * 定义通知事件订阅者,处理接收到的消息
 */
static class NotificationEventSubscriber extends CommonEventSubscriber {
    //
    private final AbilitySlice slice;

    /**
     * Constructor
     *
     * @param subscribeInfo subscribe information
     * @param slice         slice who own the subscriber
     */
    public NotificationEventSubscriber(CommonEventSubscribeInfo subscribeInfo, AbilitySlice slice) {
        super(subscribeInfo);
        this.slice = slice;
    }

    @Override
    public void onReceiveEvent(CommonEventData commonEventData) {
        Intent intent = commonEventData.getIntent();
        if (intent == null) {
            return;
        }
        //
        if (Const.NOTIFICATION_ACTION.equals(intent.getAction())) {

            PacMap pacMap = NotificationUserInput.getInputsFromIntent(intent);

            if (pacMap == null) {
                return;
            }
            //
            String inputText = pacMap.getString(Const.NOTIFICATION_INPUT_KEY);
            //
            slice.getUITaskDispatcher().asyncDispatch(() -> {

                //
                Text replyText = (Text) slice.findComponentById(ResourceTable.Id_notify2_reply);
                replyText.setText(inputText);
            });
        }
    }
}

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.

Ability 中声明事件订阅者

//事件订阅者
private NotificationEventSubscriber eventSubscriber;
  • 1.
  • 2.

Ability 中订阅事件, 用到MatchingSkills/CommonEventSubscribeInfo/CommonEventManager

/**
 * 订阅通用事件
 */
private void subscribeCommonEvent() {
    //
    MatchingSkills skills = new MatchingSkills();
    skills.addEvent(Const.NOTIFICATION_ACTION);
    //
    CommonEventSubscribeInfo subscribeInfo = new CommonEventSubscribeInfo(skills);
    subscribeInfo.setThreadMode(CommonEventSubscribeInfo.ThreadMode.HANDLER);
    //
    eventSubscriber = new NotificationEventSubscriber(subscribeInfo, this);
    try {
        //
        CommonEventManager.subscribeCommonEvent(eventSubscriber);
    } catch (RemoteException e) {
        HiLog.error(LABEL_LOG, "%{public}s", "subscribeCommonEvent remoteException.");
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.

2.取消订阅

/**
 * 取消订阅
 */
private void unSubscribeCommonEvent() {
    try {
        //
        CommonEventManager.unsubscribeCommonEvent(eventSubscriber);
    } catch (RemoteException e) {
        HiLog.error(LABEL_LOG, "%{public}s", "unSubscribeCommonEvent remoteException.");
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

3.发布普通通知

定义了一个公共通知主题,包括通知音、振动、锁屏显示和级别

/**
 * 定义通知槽
 */
private void defineNotificationSlot() {

    NotificationSlot notificationSlot =
            new NotificationSlot(Const.SLOT_ID, Const.SLOT_NAME, NotificationSlot.LEVEL_HIGH);
    //设置是否在收到通知时启用振动。
    notificationSlot.setEnableVibration(true);
    //设置锁屏可见性
    notificationSlot.setLockscreenVisibleness(NotificationRequest.VISIBLENESS_TYPE_PUBLIC);
    //设置声音
    Uri uri = Uri.parse(Const.SOUND_URI);
    notificationSlot.setSound(uri);
    try {
        //添加通知槽
        NotificationHelper.addNotificationSlot(notificationSlot);
    } catch (RemoteException ex) {
        HiLog.error(LABEL_LOG, "%{public}s", "defineNotificationSlot remoteException.");
    }
}

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.

发布通知,用到NotificationRequest/NotificationRequest.NotificationNormalContent/NotificationRequest.NotificationContent/IntentAgent/IntentAgentConstant.OperationType/NotificationHelper

/**
 * 发布通知
 */
private void publishNotification() {
    notificationId = 0x1000001;
    NotificationRequest request = new NotificationRequest(notificationId).setSlotId(Const.SLOT_ID)
            .setTapDismissed(true);
    request.setContent(createNotificationContent(Const.NOTIFICATION_TITLE, Const.NOTIFICATION_CONTENT));
    IntentAgent intentAgent = createIntentAgent(MainAbility.class.getName(),
            IntentAgentConstant.OperationType.START_ABILITY);
    request.setIntentAgent(intentAgent);
    try {
        NotificationHelper.publishNotification(request);
    } catch (RemoteException ex) {
        HiLog.error(LABEL_LOG, "%{public}s", "publishNotification remoteException.");
    }
}

/**
 * 创建通知内容
 * @param title 标题
 * @param text  内容
 * @return
 */
private NotificationRequest.NotificationContent createNotificationContent(String title, String text) {
    NotificationRequest.NotificationNormalContent content= new NotificationRequest.NotificationNormalContent()
            .setTitle(title).setText(text);
    return new NotificationRequest.NotificationContent(content);
}

/**
 * 创建IntentAgent
 * @param ability own Ability
 * @param operationType
 * @return
 */
private IntentAgent createIntentAgent(String ability, IntentAgentConstant.OperationType operationType) {
    Intent intent = new Intent();
    Operation operation = new Intent.OperationBuilder().withAction(Const.NOTIFICATION_ACTION).build();
    intent.setOperation(operation);
    //标识使用 IntentAgent 的操作,例如启动能力或发送公共事件。
    if (operationType != IntentAgentConstant.OperationType.SEND_COMMON_EVENT) {
        intent.setElement(new ElementName("", Const.BUNDLE_NAME, ability));
    }
    List<Intent> intents = new ArrayList<>();
    intents.add(intent);
    //实例化IntentAgentInfo
    IntentAgentInfo agentInfo = new IntentAgentInfo(Const.REQUEST_CODE, operationType,
            IntentAgentConstant.Flags.UPDATE_PRESENT_FLAG, intents, new IntentParams());

    return IntentAgentHelper.getIntentAgent(getContext(), agentInfo);
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.

4.发布带有回复操作的通知

比普通通知多了NotificationUserInput/NotificationActionButton/NotificationConstant.SemanticActionButton

/**
 * 发布带有回复操作的通知
 */
private void publishNotificationWithAction() {
    notificationId = 0x1000002;
    //通知请求
    NotificationRequest request = new NotificationRequest(notificationId)
            .setSlotId(Const.SLOT_ID).setTapDismissed(true);
    request.setContent(createNotificationContent(Const.NOTIFICATION_TITLE2, Const.NOTIFICATION_CONTENT2));
    //实例化IntentAgent
    IntentAgent intentAgent = createIntentAgent(MainAbility.class.getName(),
            IntentAgentConstant.OperationType.SEND_COMMON_EVENT);
    request.setIntentAgent(intentAgent);
    //用户输入
    NotificationUserInput input = new NotificationUserInput.Builder(Const.NOTIFICATION_INPUT_KEY)
            .setTag(Const.NOTIFICATION_OPER_TITLE).build();
    //操作按钮
    NotificationActionButton actionButton = new NotificationActionButton
            .Builder(null, Const.NOTIFICATION_OPER_TITLE, intentAgent)
            .addNotificationUserInput(input)
            .setSemanticActionButton(NotificationConstant.SemanticActionButton.ARCHIVE_ACTION_BUTTON)
            .setAutoCreatedReplies(false)
            .build();
    //
    request.addActionButton(actionButton);
    try {
        //发布通知
        NotificationHelper.publishNotification(request);
    } catch (RemoteException ex) {
        HiLog.error(LABEL_LOG, "%{public}s", "publishNotificationWithAction remoteException.");
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.

5.取消通知/全部通知

/**
 * 取消通知
 */
private void cancel() {
    try {
        //
        NotificationHelper.cancelNotification(notificationId);
    } catch (RemoteException ex) {
        HiLog.error(LABEL_LOG, "%{public}s", "cancel remoteException.");
    }
}

/**
 * 取消所有通知
 */
private void cancelAll() {
    try {
        //
        NotificationHelper.cancelAllNotifications();
    } catch (RemoteException ex) {
        HiLog.error(LABEL_LOG, "%{public}s", "cancelAll remoteException.");
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.

6.主动 激活 IntentAgent

触发一个 IntentAgent,调用此方法后,将执行与指定的 IntentAgent 关联的事件,例如启动一个能力或发送一个普通事件。

/**
 * 主动 激活 IntentAgent
 * @param component
 */
private void proactiveActivateIntentAgent(Component component) {
    //触发一个 IntentAgent。
    //调用此方法后,将执行与指定的 IntentAgent 关联的事件,例如启动一个能力或发送一个普通事件。
    IntentAgentHelper.triggerIntentAgent(this, createIntentAgent(MainAbility.class.getName(),
            IntentAgentConstant.OperationType.START_ABILITY), null, null,
            new TriggerInfo(null, null, null, Const.REQUEST_CODE));
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

完整代码

附件直接下载

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
Notification.zip 1.29M 73次下载
3
收藏 3
回复
举报
3
1
3
1条回复
按时间正序
/
按时间倒序
Anzia
Anzia

wow,速度。我水了好久

回复
2021-8-11 00:26:24


回复
    相关推荐