Starten einer App für Ergebnisse

Wichtige APIs

Erfahren Sie, wie Sie eine App über eine andere App starten und Daten zwischen den beiden Apps austauschen. Dies wird als Starten einer App für Ergebnisse bezeichnet. Das folgende Beispiel zeigt, wie Sie launchUriForResultsAsync verwenden, um eine App für Ergebnisse zu starten.

Mit neuen App-zu-App-Kommunikations-APIs in Windows 10 können Windows-Apps (und Windows-Web-Apps) eine App starten und Daten und Dateien austauschen. Auf diese Weise können Sie Mash-Up-Lösungen aus mehreren Apps erstellen. Mithilfe dieser neuen APIs können komplexe Aufgaben, die der Benutzer für die Verwendung mehrerer Apps benötigt hätte, jetzt nahtlos verarbeitet werden. Ihre App kann z. B. eine App für soziale Netzwerke starten, um einen Kontakt auszuwählen, oder eine Auscheck-App starten, um einen Zahlungsvorgang abzuschließen.

Die App, die Sie für Ergebnisse starten, wird als gestartete App bezeichnet. Die App, die die App startet, wird als aufrufende App bezeichnet. In diesem Beispiel schreiben Sie sowohl die aufrufende App als auch die gestartete App.

Schritt 1: Registrieren Des Protokolls für die Verarbeitung in der App, die Sie für Ergebnisse starten

Fügen Sie in der Datei "Package.appxmanifest" der gestarteten App dem <Abschnitt "Application> " eine Protokollerweiterung hinzu. Im folgenden Beispiel wird ein fiktives Protokoll mit dem Namen "test-app2app" verwendet.

Das ReturnResults-Attribut in der Protokollerweiterung akzeptiert einen der folgenden Werte:

In diesem Beispiel für die Protokollerweiterung kann die App nur für Ergebnisse gestartet werden. Dies vereinfacht die Logik innerhalb der OnActivated-Methode , die unten erläutert wird, da wir nur den Fall "gestartet für Ergebnisse" behandeln müssen und nicht die anderen Möglichkeiten, wie die App aktiviert werden könnte.

<Applications>
   <Application ...>

     <Extensions>
       <uap:Extension Category="windows.protocol">
         <uap:Protocol Name="test-app2app" ReturnResults="always">
           <uap:DisplayName>Test app-2-app</uap:DisplayName>
         </uap:Protocol>
       </uap:Extension>
     </Extensions>

   </Application>
</Applications>

Schritt 2: Überschreiben von Application.OnActivated in der App, die Sie für Ergebnisse starten

Wenn diese Methode in der gestarteten App noch nicht vorhanden ist, erstellen Sie sie innerhalb der klasse, die App in App.xaml.cs definiert ist.

In einer App, mit der Sie Ihre Freunde in einem sozialen Netzwerk auswählen können, könnte diese Funktion der Ort sein, an dem Sie die Personenauswahlseite öffnen. Im nächsten Beispiel wird eine Seite mit dem Namen "LaunchedForResultsPage " angezeigt, wenn die App für Ergebnisse aktiviert wird. Stellen Sie sicher, dass die using-Anweisung oben in der Datei enthalten ist.

using Windows.ApplicationModel.Activation;
...
protected override void OnActivated(IActivatedEventArgs args)
{
    // Window management
    Frame rootFrame = Window.Current.Content as Frame;
    if (rootFrame == null)
    {
        rootFrame = new Frame();
        Window.Current.Content = rootFrame;
    }

    // Code specific to launch for results
    var protocolForResultsArgs = (ProtocolForResultsActivatedEventArgs)args;
    // Open the page that we created to handle activation for results.
    rootFrame.Navigate(typeof(LaunchedForResultsPage), protocolForResultsArgs);

    // Ensure the current window is active.
    Window.Current.Activate();
}
using namespace winrt::Windows::ApplicationModel::Activation;
...
protected override void OnActivated(IActivatedEventArgs args)
{
    // Window management
    Frame rootFrame{ nullptr };
    auto content = Window::Current().Content();
    if (content)
    {
        rootFrame = content.try_as<Frame>();
    }
    
    if (rootFrame == null)
    {
        rootFrame = Frame();
        Window::Current().Content(rootFrame);
    }

    // Code specific to launch for results
    auto protocolForResultsEventArgs{ args.as<ProtocolForResultsActivatedEventArgs>() };
    // Open the page that we created to handle activation for results.
    rootFrame.Navigate(xaml_typename<LaunchedForResultsPage>(), protocolForResultsArgs);

    // Ensure the current window is active.
    Window::Current().Activate();
}

Da die Protokollerweiterung in der Datei "Package.appxmanifest" "ReturnResults" wie immer angibt, kann der soeben angezeigte Code direkt in ProtocolForResultsActivatedEventArgs mit dem Vertrauen umwandelnargs, dass nur ProtocolForResultsActivatedEventArgs für diese App an "OnActivated" gesendet wird. Wenn Ihre App auf andere Weise als das Starten für Ergebnisse aktiviert werden kann, können Sie überprüfen, ob die IActivatedEventArgs.Kind-Eigenschaft "ActivationKind.ProtocolForResults" zurückgibt, um festzustellen, ob die App für Ergebnisse gestartet wurde.

Schritt 3: Hinzufügen eines ProtocolForResultsOperation-Felds zur App, die Sie für Ergebnisse starten

private Windows.System.ProtocolForResultsOperation _operation = null;
Windows::System::ProtocolForResultsOperation _operation = nullptr;

Sie verwenden das ProtocolForResultsOperation-Feld , um zu signalisieren, wenn die gestartete App bereit ist, das Ergebnis an die aufrufende App zurückzugeben. In diesem Beispiel wird das Feld der LaunchedForResultsPage-Klasse hinzugefügt, da Sie den Start-für-Ergebnisse-Vorgang von dieser Seite abschließen und darauf zugreifen müssen.

Schritt 4: Überschreiben von OnNavigatedTo() in der App, die Sie für Ergebnisse starten

Überschreiben Sie die OnNavigatedTo-Methode auf der Seite, die angezeigt wird, wenn Ihre App für Ergebnisse gestartet wird. Wenn diese Methode noch nicht vorhanden ist, erstellen Sie sie innerhalb der Klasse für die im <Seitennamen> definierte Seite.xaml.cs. Stellen Sie sicher, dass die folgende using-Anweisung am Anfang der Datei enthalten ist:

using Windows.ApplicationModel.Activation
using namespace winrt::Windows::ApplicationModel::Activation;

Das NavigationEventArgs-Objekt in der OnNavigatedTo-Methode enthält die von der aufrufenden App übergebenen Daten. Die Daten dürfen 100 KB nicht überschreiten und in einem ValueSet-Objekt gespeichert werden.

In diesem Beispielcode erwartet die gestartete App, dass sich die von der aufrufenden App gesendeten Daten in einem ValueSet unter einem Schlüssel namens TestData befinden, da dies der Code der aufrufenden App im Beispiel ist.

using Windows.ApplicationModel.Activation;
...
protected override void OnNavigatedTo(NavigationEventArgs e)
{
    var protocolForResultsArgs = e.Parameter as ProtocolForResultsActivatedEventArgs;
    // Set the ProtocolForResultsOperation field.
    _operation = protocolForResultsArgs.ProtocolForResultsOperation;

    if (protocolForResultsArgs.Data.ContainsKey("TestData"))
    {
        string dataFromCaller = protocolForResultsArgs.Data["TestData"] as string;
    }
}
...
private Windows.System.ProtocolForResultsOperation _operation = null;
using namespace winrt::Windows::ApplicationModel::Activation;
...
protected override void OnNavigatedTo(NavigationEventArgs e)
{
    auto protocolForResultsArgs = e.Parameter().try_as<ProtocolForResultsActivatedEventArgs>();
    // Set the ProtocolForResultsOperation field.
    _operation = protocolForResultsArgs.ProtocolForResultsOperation();

    if (protocolForResultsArgs.Data().HasKey("TestData"))
    {
        string dataFromCaller{ unbox_value<hstring>(protocolForResultsArgs.Data().Lookup("TestData")) };
    }
}
...
Windows::System::ProtocolForResultsOperation _operation = nullptr;

Schritt 5: Schreiben von Code zum Zurückgeben von Daten an die aufrufende App

Verwenden Sie in der gestarteten App ProtocolForResultsOperation , um Daten an die aufrufende App zurückzugeben. In diesem Beispielcode wird ein ValueSet-Objekt erstellt, das den Wert enthält, der an die aufrufende App zurückgegeben werden soll. Das ProtocolForResultsOperation-Feld wird dann verwendet, um den Wert an die aufrufende App zu senden.

    ValueSet result = new ValueSet();
    result["ReturnedData"] = "The returned result";
    _operation.ReportCompleted(result);
    ValueSet result;
    result.Insert("ReturnedData", "The returned result");
    _operation.ReportCompleted(result);

Schritt 6: Schreiben von Code zum Starten der App für Ergebnisse und Abrufen der zurückgegebenen Daten

Starten Sie die App aus einer asynchronen Methode in Ihrer aufrufenden App, wie in diesem Beispielcode gezeigt. Beachten Sie die using-Anweisungen , die für die Kompilierung des Codes erforderlich sind:

using System.Threading.Tasks;
using Windows.System;
...

async Task<string> LaunchAppForResults()
{
    var testAppUri = new Uri("test-app2app:"); // The protocol handled by the launched app
    var options = new LauncherOptions();
    options.TargetApplicationPackageFamilyName = "67d987e1-e842-4229-9f7c-98cf13b5da45_yd7nk54bq29ra";

    var inputData = new ValueSet();
    inputData["TestData"] = "Test data";

    string theResult = "";
    LaunchUriResult result = await Windows.System.Launcher.LaunchUriForResultsAsync(testAppUri, options, inputData);
    if (result.Status == LaunchUriStatus.Success &&
        result.Result != null &&
        result.Result.ContainsKey("ReturnedData"))
    {
        ValueSet theValues = result.Result;
        theResult = theValues["ReturnedData"] as string;
    }
    return theResult;
}

In diesem Beispiel wird ein ValueSet mit dem Schlüssel TestData an die gestartete App übergeben. Die gestartete App erstellt ein ValueSet mit dem Schlüssel " ReturnedData ", der das an den Aufrufer zurückgegebene Ergebnis enthält.

Sie müssen die App erstellen und bereitstellen, die Sie für Ergebnisse starten, bevor Sie Ihre aufrufende App ausführen. Andernfalls meldet LaunchUriResult.Status LaunchUriStatus.AppUnavailable.

Sie benötigen den Familiennamen der gestarteten App, wenn Sie " TargetApplicationPackageFamilyName" festlegen. Eine Möglichkeit zum Abrufen des Familiennamens besteht darin, den folgenden Aufruf innerhalb der gestarteten App zu tätigen:

string familyName = Windows.ApplicationModel.Package.Current.Id.FamilyName;

Hinweise

Das Beispiel in dieser Vorgehensweise bietet eine Einführung in "Hello World" zum Starten einer App für Ergebnisse. Die wichtigsten Punkte sind, dass Sie mit der neuen LaunchUriForResultsAsync-API asynchron eine App starten und über die ValueSet-Klasse kommunizieren können. Das Übergeben von Daten über ein ValueSet ist auf 100 KB beschränkt. Wenn Sie größere Datenmengen übergeben müssen, können Sie Dateien mithilfe der SharedStorageAccessManager-Klasse freigeben, um Dateitoken zu erstellen, die Sie zwischen Apps übergeben können. Wenn Sie beispielsweise einen ValueSet-Namen inputData haben, können Sie das Token in einer Datei speichern, die Sie für die gestartete App freigeben möchten:

inputData["ImageFileToken"] = SharedStorageAccessManager.AddFile(myFile);

Übergeben Sie sie dann über LaunchUriForResultsAsync an die gestartete App.