Fortsetzen von Benutzeraktivitäten (auch geräteübergreifend)

In diesem Thema wird beschrieben, wie Sie Benutzern dabei helfen, ihre App auf ihrem PC und geräteübergreifend fortzusetzen.

Hinweis

Ab Juli 2021 haben Benutzer, deren Aktivitätsverlauf auf ihren Windows-Geräten über ihr Microsoft-Konto (MSA) synchronisiert wird, nicht mehr die Möglichkeit, neue Aktivitäten auf die Zeitachse hochzuladen. Sie können die Zeitachse weiterhin verwenden und ihren Aktivitätsverlauf (Informationen zu aktuellen Apps, Websites und Dateien) auf ihrem lokalen PC anzeigen. Mit AAD verbundene Konten sind nicht betroffen.

Benutzeraktivitäten und Zeitachse

Unsere Tageszeit ist auf mehrere Geräte verteilt. Wir können unser Telefon im Bus, einen PC während des Tages und dann ein Telefon oder Tablet am Abend verwenden. Ab Windows 10 Build 1803 oder höher wird diese Aktivität beim Erstellen einer Benutzeraktivität auf Windows Zeitachse und in der Funktion Pick up where I left off von Cortana angezeigt. Die Zeitachse ist eine umfassende Aufgabenansicht, in der Benutzeraktivitäten genutzt werden, um eine chronologische Ansicht ihrer Arbeit anzuzeigen. Dies kann auch das umfassen, an dem Sie geräteübergreifend gearbeitet haben.

Windows Zeitachsenbild

Ebenso können Sie mit dem Verknüpfen Ihres Telefons mit Ihrem Windows PC fortfahren, was Sie zuvor auf Ihrem iOS- oder Android-Gerät getan haben.

Stellen Sie sich eine UserActivity als etwas bestimmtes vor, an dem der Benutzer in Ihrer App gearbeitet hat. Wenn Sie beispielsweise einen RSS-Reader verwenden, kann eine UserActivity der Feed sein, den Sie lesen. Wenn Sie ein Spiel spielen, kann die UserActivity die Ebene sein, die Sie spielen. Wenn Sie eine Musik-App überwachen, kann die UserActivity die Wiedergabeliste sein, auf die Sie lauschen. Wenn Sie an einem Dokument arbeiten, kann die UserActivity der Ort sein, an dem Sie aufgehört haben, daran zu arbeiten usw. Kurz gesagt stellt eine UserActivity ein Ziel innerhalb Ihrer App dar, sodass der Benutzer seine Arbeit fortsetzen kann.

Wenn Sie eine UserActivity durch Aufrufen von UserActivity.CreateSessionaufrufen, erstellt das System einen Verlaufsdatensatz, der die Start- und Endzeit für diese UserActivity angibt. Wenn Sie sich im Laufe der Zeit erneut mit dieser UserActivity befassen, werden mehrere Verlaufsdatensätze dafür aufgezeichnet.

Hinzufügen von Benutzeraktivitäten zu Ihrer App

Eine UserActivity ist die Einheit der Benutzerbindung in Windows. Sie umfasst drei Teile: einen URI, der zum Aktivieren der App verwendet wird, zu der die Aktivität gehört, visuelle Elemente und Metadaten, die die Aktivität beschreiben.

  1. Der ActivationUri wird verwendet, um die Anwendung mit einem bestimmten Kontext fortzusetzen. Dieser Link hat in der Regel die Form eines Protokollhandlers für ein Schema (z.B. "my-app://page2?action=edit") oder eines AppUriHandlers (z. http://constoso.com/page2?action=edit) B. .
  2. VisualElements macht eine Klasse verfügbar, die es dem Benutzer ermöglicht, eine Aktivität mit einem Titel, einer Beschreibung oder adaptiven Kartenelementen visuell zu identifizieren.
  3. Schließlich können Sie mit Inhalt Metadaten für die Aktivität speichern, die zum Gruppieren und Abrufen von Aktivitäten in einem bestimmten Kontext verwendet werden können. Häufig hat dies die Form von https://schema.org Daten.

So fügen Sie Ihrer App eine UserActivity hinzu:

  1. Generieren von UserActivity-Objekten, wenn sich der Kontext Ihres Benutzers innerhalb der App ändert (z. B. Seitennavigation, neue Spielebene usw.)
  2. Füllen Sie UserActivity-Objekte mit den mindestens erforderlichen Feldern auf: ActivityId, ActivationUriund UserActivity.VisualElements.DisplayText.
  3. Fügen Sie Ihrer App einen benutzerdefinierten Schemahandler hinzu, damit sie von einer UserActivity erneut aktiviert werden kann.

Eine UserActivity kann mit nur wenigen Codezeilen in eine App integriert werden. Stellen Sie sich beispielsweise diesen Code in MainPage.xaml.cs innerhalb der MainPage-Klasse vor (Hinweis: geht von using Windows.ApplicationModel.UserActivities; aus):

UserActivitySession _currentActivity;
private async Task GenerateActivityAsync()
{
    // Get the default UserActivityChannel and query it for our UserActivity. If the activity doesn't exist, one is created.
    UserActivityChannel channel = UserActivityChannel.GetDefault();
    UserActivity userActivity = await channel.GetOrCreateUserActivityAsync("MainPage");
 
    // Populate required properties
    userActivity.VisualElements.DisplayText = "Hello Activities";
    userActivity.ActivationUri = new Uri("my-app://page2?action=edit");
     
    //Save
    await userActivity.SaveAsync(); //save the new metadata
 
    // Dispose of any current UserActivitySession, and create a new one.
    _currentActivity?.Dispose();
    _currentActivity = userActivity.CreateSession();
}

Die erste Zeile in der obigen Methode ruft den GenerateActivityAsync() UserActivityChanneleines Benutzers ab. Dies ist der Feed, in dem die Aktivitäten dieser App veröffentlicht werden. In der nächsten Zeile wird der Kanal einer Aktivität mit dem Namen MainPage abgefragt.

  • Ihre App sollte Aktivitäten so benennen, dass dieselbe ID jedes Mal generiert wird, wenn sich der Benutzer an einem bestimmten Ort in der App befindet. Wenn Ihre App beispielsweise seitenbasiert ist, verwenden Sie einen Bezeichner für die Seite. Wenn das Dokument auf basiert, verwenden Sie den Namen des Dokuments (oder einen Hash des Namens).
  • Wenn im Feed eine Aktivität mit der gleichen ID vorhanden ist, wird diese Aktivität vom Kanal zurückgegeben, wobei UserActivity.State auf Veröffentlicht festgelegt ist. Wenn keine Aktivität mit diesem Namen vorhanden ist und neue Aktivität zurückgegeben wird, wobei UserActivity.State auf Neu festgelegt ist.
  • Aktivitäten werden auf Ihre App umgrenzt. Sie müssen sich keine Gedanken darüber machen, dass Ihre Aktivitäts-ID mit IDs in anderen Apps kollidiert.

Geben Sie nach dem Abrufen oder Erstellen der UserActivity die beiden anderen erforderlichen Felder an: UserActivity.VisualElements.DisplayText und UserActivity.ActivationUri .

Speichern Sie als Nächstes die UserActivity-Metadaten, indem Sie SaveAsyncund schließlich CreateSessionaufrufen, wodurch eine UserActivitySessionzurückgegeben wird. Die UserActivitySession ist das Objekt, das wir verwenden können, um zu verwalten, wenn der Benutzer tatsächlich mit userActivity beschäftigt ist. Beispielsweise sollten wir Dispose() für userActivitySession aufrufen, wenn der Benutzer die Seite verlässt. Im obigen Beispiel rufen wir auch Dispose() auf, _currentActivity bevor aufgerufen CreateSession() wird. Dies liegt daran, dass wir ein Memberfeld unserer Seite erstellt _currentActivity haben und alle vorhandenen Aktivitäten beenden möchten, bevor wir die neue Aktivität starten (Hinweis: ist der ? NULL-bedingte Operator, der vor dem Ausführen des Memberzugriffs auf NULL testet).

Da in diesem Fall ActivationUri ein benutzerdefiniertes Schema ist, müssen wir auch das Protokoll im Anwendungsmanifest registrieren. Dies erfolgt in der XML-Datei Package.appmanifest oder mithilfe des Designers.

Um die Änderung mit dem Designer vorzunehmen, doppelklicken Sie auf die Datei Package.appmanifest in Ihrem Projekt, um den Designer zu starten, wählen Sie die Registerkarte Deklarationen aus, und fügen Sie eine Protokolldefinition hinzu. Die einzige Eigenschaft, die ausgefüllt werden muss, ist vorerst Name. Er sollte mit dem oben angegebenen URI () my-app übereinstimmen.

Nun müssen wir Code schreiben, um der App mitzuteilen, was sie tun soll, wenn sie von einem Protokoll aktiviert wird. Wir überschreiben die OnActivated -Methode in App.xaml.cs, um den URI wie folgt an die Hauptseite zu übergeben:

protected override void OnActivated(IActivatedEventArgs e)
{
    if (e.Kind == ActivationKind.Protocol)
    {
        var uriArgs = e as ProtocolActivatedEventArgs;
        if (uriArgs != null)
        {
            if (uriArgs.Uri.Host == "page2")
            {
                // Navigate to the 2nd page of the  app
            }
        }
    }
    Window.Current.Activate();
}

Dieser Code erkennt, ob die App über ein Protokoll aktiviert wurde. Wenn dies der Wartevorgang war, sieht es aus, was die App tun sollte, um die Aufgabe fortzusetzen, für die sie aktiviert wird. Da es sich um eine einfache App handelt, wird diese App nur fortgesetzt, wenn Sie auf der sekundären Seite angezeigt werden, wenn die App angezeigt wird.

Verwenden von Adaptive Karten zur Verbesserung der Zeitachsenerfahrung

Benutzeraktivitäten werden in Cortana und Zeitachse angezeigt. Wenn Aktivitäten auf der Zeitachse angezeigt werden, werden sie mithilfe des Adaptive Card-Frameworks angezeigt. Wenn Sie keine adaptive Karte für jede Aktivität bereitstellen, erstellt die Zeitachse automatisch eine einfache Aktivitätskarte basierend auf Ihrem Anwendungsnamen und Symbol, dem Titelfeld und optional dem Beschreibungsfeld. Im Folgenden finden Sie ein Beispiel für die Nutzlast der adaptiven Karte und die von ihr erzeugte Karte.

Eine adaptive Karte]

Beispiel für json-Zeichenfolge für die Nutzlast adaptiver Karten:

{ 
  "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", 
  "type": "AdaptiveCard", 
  "version": "1.0",
  "backgroundImage": "https://winblogs.azureedge.net/win/2017/11/eb5d872c743f8f54b957ff3f5ef3066b.jpg", 
  "body": [ 
    { 
      "type": "Container", 
      "items": [ 
        { 
          "type": "TextBlock", 
          "text": "Windows Blog", 
          "weight": "bolder", 
          "size": "large", 
          "wrap": true, 
          "maxLines": 3 
        }, 
        { 
          "type": "TextBlock", 
          "text": "Training Haiti’s radiologists: St. Louis doctor takes her teaching global", 
          "size": "default", 
          "wrap": true, 
          "maxLines": 3 
        } 
      ] 
    } 
  ]
}

Fügen Sie der UserActivity die Adaptive Karten Nutzlast wie folgt als JSON-Zeichenfolge hinzu:

activity.VisualElements.Content = 
Windows.UI.Shell.AdaptiveCardBuilder.CreateAdaptiveCardFromJson(jsonCardText); // where jsonCardText is a JSON string that represents the card

Plattformübergreifende und Dienst-zu-Dienst-Integration

Wenn Ihre App plattformübergreifend ausgeführt wird (z. B. unter Android und iOS) oder den Benutzerzustand in der Cloud verwaltet, können Sie UserActivities über Microsoft Graphveröffentlichen. Nachdem Ihre Anwendung oder Ihr Dienst mit einem Microsoft-Konto authentifiziert wurde, werden nur noch zwei einfache REST-Aufrufe benötigt, um Aktivitäts- und Verlaufsobjekte zu generieren, wobei die gleichen Daten wie oben beschrieben verwendet werden.

Zusammenfassung

Sie können die UserActivity-API verwenden, damit Ihre App auf der Zeitachse und Cortana angezeigt wird.

Schlüssel-APIs