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

In diesem Thema wird beschrieben, wie Sie Benutzern helfen können, ihre Aktivitäten in Ihrer App auf ihrem PC und auf allen Geräten 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 Zeit ist jeden Tag auf mehrere Geräte verteilt. Wir können unser Handy im Bus verwenden, einen PC während des Tages, dann ein Telefon oder Tablet am Abend. Ab Windows 10 Build 1803 oder höher wird durch das Erstellen einer Benutzeraktivität diese Aktivität in der Windows-Zeitachse und in Cortanas Feature "Pick up where I left off" angezeigt. Die Zeitachse ist eine umfangreiche Aufgabenansicht, die benutzeraktivitäten nutzt, um eine chronologische Ansicht dessen anzuzeigen, worüber Sie gearbeitet haben. Es kann auch das enthalten, worüber Sie auf allen Geräten gearbeitet haben.

Windows Zeitleiste-Image

Ebenso können Sie durch das Verknüpfen Ihres Smartphones mit Ihrem Windows-PC ihre bisherigen Aktionen auf Ihrem iOS- oder Android-Gerät fortsetzen.

Stellen Sie sich eine UserActivity als etwas spezifisches 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 gerade lesen. Wenn Sie ein Spiel spielen, kann die UserActivity die Ebene sein, die Sie spielen. Wenn Sie eine Musik-App hören, kann die UserActivity die Wiedergabeliste sein, die Sie hören. Wenn Sie an einem Dokument arbeiten, kann sich die UserActivity an der Stelle befinden, an der Sie die Arbeit daran aufgehört haben usw. Kurz gesagt, eine UserActivity stellt ein Ziel innerhalb Ihrer App dar, sodass der Benutzer seine Aktionen fortsetzen kann.

Wenn Sie mit einer UserActivity interagieren, indem Sie UserActivity.CreateSession aufrufen, erstellt das System einen Verlaufsdatensatz, der die Start- und Endzeit für diese UserActivity angibt. Wenn Sie diese UserActivity im Laufe der Zeit erneut nutzen, werden mehrere Verlaufsdatensätze für sie aufgezeichnet.

Hinzufügen von Benutzeraktivitäten zu Ihrer App

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

  1. Der ActivationUri wird verwendet, um die Anwendung mit einem bestimmten Kontext fortzusetzen. In der Regel hat dieser Link die Form eines Protokollhandlers für ein Schema (z. B. "my-app://page2?action=edit") oder einen AppUriHandler (z. B http://contoso.com/page2?action=edit. ).
  2. VisualElements macht eine Klasse verfügbar, die es dem Benutzer ermöglicht, eine Aktivität visuell mit einem Titel, einer Beschreibung oder einem Adaptive Card-Element zu identifizieren.
  3. Schließlich können Sie in Content 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 erfolgt dies in 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 dem Mindestsatz von erforderlichen Feldern auf: ActivityId, ActivationUri und 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 in der MainPage-Klasse vor (Hinweis: setzt voraus using Windows.ApplicationModel.UserActivities;: ):

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 GenerateActivityAsync() obigen Methode ruft den UserActivityChannel eines Benutzers ab. Dies ist der Feed, in dem die Aktivitäten dieser App veröffentlicht werden. Die nächste Zeile fragt den Kanal einer Aktivität mit dem Namen ab MainPage.

  • Ihre App sollte Aktivitäten so benennen, dass die gleiche 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 basiert, verwenden Sie den Namen des Dokuments (oder einen Hash des Namens).
  • Wenn im Feed eine Aktivität mit derselben ID vorhanden ist, wird diese Aktivität aus dem Kanal zurückgegeben, der UserActivity.State auf Veröffentlicht festgelegt ist. Wenn keine Aktivität mit diesem Namen vorhanden ist und eine neue Aktivität zurückgegeben wird, die UserActivity.State auf Neu festgelegt ist.
  • Aktivitäten sind auf Ihre App ausgerichtet. Sie müssen sich keine Sorgen machen, dass Ihre Aktivitäts-ID mit IDs in anderen Apps kollidieren.

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

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

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

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

Jetzt müssen wir Code schreiben, um der App mitzuteilen, was zu tun ist, wenn sie von einem Protokoll aktiviert wurde. Wir überschreiben die OnActivated -Methode in App.xaml.cs, um den URI wie folgt an die seite Standard 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 Fall war, wird überprüft, was die App tun sollte, um die Aufgabe fortzusetzen, für die sie aktiviert wird. Da es sich um eine einfache App handelt, besteht die einzige Aktivität, die diese App fortsetzt, darin, Sie auf die sekundäre Seite zu setzen, wenn die App angezeigt wird.

Verwenden von adaptiven Karten zum Verbessern der Zeitachse

Benutzeraktivitäten werden in Cortana und der Zeitachse angezeigt. Wenn Aktivitäten in der Zeitachse angezeigt werden, werden sie mithilfe des Frameworks für adaptive Karten angezeigt. Wenn Sie keine adaptive Karte für jede Aktivität bereitstellen, erstellt Die Zeitachse automatisch eine einfache Aktivität Karte basierend auf Dem Namen und Symbol Ihrer Anwendung, dem Titelfeld und dem optionalen Beschreibungsfeld. Im Folgenden finden Sie ein Beispiel für adaptive Kartennutzlast und die Karte, die sie erzeugt.

Adaptive Karte]

Beispiel für json-Zeichenfolge für adaptive Karte Nutzlast:

{ 
  "$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 Nutzlast adaptiver Karten 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- und Dienst-zu-Dienst-Integration

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

Zusammenfassung

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

Schlüssel-APIs