Introduction.

Notifications are non-intrusive messages in NAV. You can see many links about this, like my older post about this subject:
With AL, notifications change and pattern improves with notification life cycle. We don´t trigger SEND sentence with the notification directly, we use Notification Life Cycle management Codeunit for this purpose. This way we have an automated control of older Notifications and their state.

New notifications example.

We are going to do a Notification that raise a message every time we use an item without customer specific price settled, in sales documents.
We also can set which items will be checked in this notification, filtering in My notifications:
When we introduce an item without a customer price send this message:

Code breakdown.

Step 1. Publish and set Notification.

First step is making visible new notification in My Notifications:
[EventSubscriber(ObjectType::Page, Page::"My Notifications", 'OnInitializingNotificationWithDefaultState', '', true, true)]
    local procedure OnInitializingNotificationWithDefaultState()
    var
        MyNotifications: Record "My Notifications";
    begin
        //This function make visible the personal notification in My Notifications
        MyNotifications.InsertDefaultWithTableNum(GetNotificationId,
        NotificationTxt,
        NotificationDescriptionTxt,
        DATABASE::Item);
    end;
Previous function uses this function bellow to get notification ID, that returns a hard coded (yes, here is allowed!!) GUID:
    local procedure GetNotificationId(): Text
    begin
        exit('4D0CBFC6-94DC-4F8A-ACA8-11126D6AA82F');
    end;
In Waldo´s extension CRS you have a snippet that implements the two publishing functions.
And the final definition function to perform check if notification is enabled using the master table settled above (Item):
    local procedure IsNotificationEnabled(Item: Record Item): Boolean
    var
        MyNotifications: Record "My Notifications";
    begin
        EXIT(MyNotifications.IsEnabledForRecord(GetNotificationId, Item));
    end;

Step 2 Perform check and show notification (if required)

First function performs check and notification, but we use the new pattern Codeunits to implement Notification lifecycle: https://community.dynamics.com/nav/w/designpatterns/284.in-context-notifications . The great difference between old NAV Notifications and new Business Central Notifications is that new system is doing all through the Codeunit "Notification Lifecycle Mgt.", to avoid duplication and keep previous notifications not clicked. So before check, we call recall notifications:
procedure SalesLineCheck(SalesLine: Record "Sales Line") Rollback: Boolean;
    var
        NotificationLifecycleMgt: Codeunit "Notification Lifecycle Mgt.";
    begin
        //This funtion begins all the notification Cycle.
        //Could be invoked from a subscription  or new table validation.
        NotificationLifecycleMgt.RecallNotificationsForRecordWithAdditionalContext(
                                SalesLine.RECORDID, GetNotificationId, TRUE);
 
        IF ShowWarning(SalesLine) THEN
            Rollback := CreateAndSendNotification(SalesLine."No.", SalesLine."Sell-to Customer No.", SalesLine.RecordId);
    end;
We don´t go to breakdown inside "Notification Lifecycle Mgt.", only say is a Single instance Codeunit that tracks all the notifications in a temporary table and manage in automatic way their state.
ShowWarning function performs the check itself, so will be different in all notification programs. If this function rules that the notification must be shown we call this other function, that also use "Notification Lifecycle Mgt.":
    local procedure CreateAndSendNotification(ItemNo: Code[20]; CustNo: Code[20]; RecordId: RecordId): Boolean
    var
        RealeasedNotification: Notification;
        NotificationLifecycleMgt: Codeunit "Notification Lifecycle Mgt.";
    begin
        RealeasedNotification.ID(GetNotificationId());
        RealeasedNotification.MESSAGE(STRSUBSTNO(NotificationMsg, ItemNo, CustNo));
        RealeasedNotification.SCOPE(NOTIFICATIONSCOPE::LocalScope);
        RealeasedNotification.ADDACTION(DetailsTxt, CODEUNIT::"Sales Price Avail. Check", 'ShowNotificationDetails');
        PopulateDataOnNotification(RealeasedNotification, ItemNo, CustNo);
        NotificationLifecycleMgt.SendNotificationWithAdditionalContext(RealeasedNotification, RecordId, GetNotificationId);
        EXIT(FALSE);
    end;
Optionally we can add a details page to show closely the complete warning context:
    procedure ShowNotificationDetails(ReleasedNotification: Notification)
    var
        SalesPrices: Page "Sales Prices";
    begin
        //This function opens a Page if user ask for details
        SalesPrices.InitializeFromNotification(ReleasedNotification);
        SalesPrices.RUNMODAL;
    end;
And this Page must include an initialization function from  the notification. Not very usual, but in this occasion I am using an existing page and extending it with a new function.:
pageextension 69000 "Sales Price EXT" extends "Sales Prices"
{
    procedure InitializeFromNotification(ReleasedNotification: Notification)
    begin
        SetRange("Sales Type", "Sales Type"::Customer);
        SetRange("Sales Code", ReleasedNotification.GetData('CustNo'));
        SetRange("Item No.", ReleasedNotification.GetData('ItemNo'));
    end;
}

Notification snippet.

I´ve made a rudimental snippet with a complete notification implementation. I will improve it with easier tab-stops, building an extension an trying to include an assisted set-up snippet too, but I want to share this as soon as possible, I think even in this half-baked version could be useful:
https://github.com/JalmarazMartn/AlNotification