Share via


Meluncurkan aplikasi untuk hasil

API penting

Pelajari cara meluncurkan aplikasi dari aplikasi lain dan bertukar data di antara keduanya. Ini disebut meluncurkan aplikasi untuk hasil. Contoh di sini menunjukkan kepada Anda cara menggunakan LaunchUriForResultsAsync untuk meluncurkan aplikasi untuk hasil.

API komunikasi aplikasi ke aplikasi baru di Windows 10 memungkinkan aplikasi Windows (dan aplikasi Windows Web) meluncurkan aplikasi dan bertukar data dan file. Ini memungkinkan Anda untuk membangun solusi mash-up dari beberapa aplikasi. Menggunakan API baru ini, tugas kompleks yang akan mengharuskan pengguna untuk menggunakan beberapa aplikasi sekarang dapat ditangani dengan mulus. Misalnya, aplikasi Anda dapat meluncurkan aplikasi jejaring sosial untuk memilih kontak, atau meluncurkan aplikasi pembayaran untuk menyelesaikan proses pembayaran.

Aplikasi yang akan Anda luncurkan untuk hasil akan disebut sebagai aplikasi yang diluncurkan. Aplikasi yang meluncurkan aplikasi akan disebut sebagai aplikasi panggilan. Untuk contoh ini, Anda akan menulis aplikasi panggilan dan aplikasi yang diluncurkan.

Langkah 1: Daftarkan protokol yang akan ditangani di aplikasi yang akan Anda luncurkan untuk hasil

Dalam file Package.appxmanifest dari aplikasi yang diluncurkan, tambahkan ekstensi protokol ke bagian <Aplikasi> . Contoh di sini menggunakan protokol fiktif bernama test-app2app.

Atribut ReturnResults dalam ekstensi protokol menerima salah satu nilai ini:

Dalam contoh ekstensi protokol ini, aplikasi hanya dapat diluncurkan untuk hasil. Ini menyederhanakan logika di dalam metode OnActivated , yang dibahas di bawah ini, karena kita hanya harus menangani kasus "diluncurkan untuk hasil" dan bukan cara lain agar aplikasi dapat diaktifkan.

<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>

Langkah 2: Ambil alih Application.OnActivated di aplikasi yang akan Anda luncurkan untuk hasil

Jika metode ini belum ada di aplikasi yang diluncurkan, buat dalam kelas yang App ditentukan di App.xaml.cs.

Dalam aplikasi yang memungkinkan Anda memilih teman di jejaring sosial, fungsi ini bisa menjadi tempat Anda membuka halaman pemilih orang. Dalam contoh berikutnya, halaman bernama LaunchedForResultsPage ditampilkan saat aplikasi diaktifkan untuk hasil. Pastikan bahwa pernyataan penggunaan disertakan di bagian atas file.

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();
}

Karena ekstensi protokol dalam file Package.appxmanifest menentukan ReturnResults seperti biasa, kode yang baru saja ditampilkan dapat ditransmisikan args langsung ke ProtocolForResultsActivatedEventArgs dengan keyakinan bahwa hanya ProtocolForResultsActivatedEventArgs yang akan dikirim ke OnActivated untuk aplikasi ini. Jika aplikasi Anda dapat diaktifkan dengan cara selain meluncurkan hasil, Anda dapat memeriksa apakah properti IActivatedEventArgs.Kind mengembalikan ActivationKind.ProtocolForResults untuk mengetahui apakah aplikasi diluncurkan untuk hasil.

Langkah 3: Tambahkan bidang ProtocolForResultsOperation ke aplikasi yang Anda luncurkan untuk hasil

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

Anda akan menggunakan bidang ProtocolForResultsOperation untuk memberi sinyal saat aplikasi yang diluncurkan siap mengembalikan hasilnya ke aplikasi panggilan. Dalam contoh ini, bidang ditambahkan ke kelas LaunchedForResultsPage karena Anda akan menyelesaikan operasi peluncuran untuk hasil dari halaman tersebut dan akan memerlukan akses ke bidang tersebut.

Langkah 4: Mengambil alih OnNavigatedTo() di aplikasi yang Anda luncurkan untuk hasil

Ganti metode OnNavigatedTo di halaman yang akan Anda tampilkan saat aplikasi diluncurkan untuk hasil. Jika metode ini belum ada, buat di dalam kelas untuk halaman yang ditentukan dalam <pagename.xaml.cs>. Pastikan bahwa pernyataan penggunaan berikut disertakan di bagian atas file:

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

Objek NavigationEventArgs dalam metode OnNavigatedTo berisi data yang diteruskan dari aplikasi panggilan. Data tidak boleh melebihi 100KB dan disimpan dalam objek ValueSet .

Dalam contoh kode ini, aplikasi yang diluncurkan mengharapkan data yang dikirim dari aplikasi panggilan berada di ValueSet di bawah kunci bernama TestData, karena itulah yang dikodekan oleh aplikasi panggilan contoh.

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;

Langkah 5: Tulis kode untuk mengembalikan data ke aplikasi panggilan

Di aplikasi yang diluncurkan, gunakan ProtocolForResultsOperation untuk mengembalikan data ke aplikasi panggilan. Dalam contoh kode ini, objek ValueSet dibuat yang berisi nilai untuk kembali ke aplikasi panggilan. Bidang ProtocolForResultsOperation kemudian digunakan untuk mengirim nilai ke aplikasi panggilan.

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

Langkah 6: Tulis kode untuk meluncurkan aplikasi untuk hasil dan mendapatkan data yang dikembalikan

Luncurkan aplikasi dari dalam metode asinkron di aplikasi panggilan Anda seperti yang ditunjukkan dalam kode contoh ini. Perhatikan pernyataan penggunaan , yang diperlukan agar kode dikompilasi:

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;
}

Dalam contoh ini, ValueSet yang berisi kunci TestData diteruskan ke aplikasi yang diluncurkan. Aplikasi yang diluncurkan membuat ValueSet dengan kunci bernama ReturnedData yang berisi hasil yang dikembalikan ke pemanggil.

Anda harus membuat dan menyebarkan aplikasi yang akan Anda luncurkan untuk hasil sebelum menjalankan aplikasi panggilan. Jika tidak, LaunchUriResult.Status akan melaporkan LaunchUriStatus.AppUnavailable.

Anda akan memerlukan nama keluarga aplikasi yang diluncurkan saat mengatur TargetApplicationPackageFamilyName. Salah satu cara untuk mendapatkan nama keluarga adalah dengan melakukan panggilan berikut dari dalam aplikasi yang diluncurkan:

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

Keterangan

Contoh dalam cara ini menyediakan pengantar "halo dunia" untuk meluncurkan aplikasi untuk hasil. Hal-hal utama yang perlu diperhatikan adalah bahwa API LaunchUriForResultsAsync baru memungkinkan Anda meluncurkan aplikasi secara asinkron dan berkomunikasi melalui kelas ValueSet . Meneruskan data melalui ValueSet dibatasi hingga 100KB. Jika Anda perlu meneruskan data dalam jumlah yang lebih besar, Anda dapat berbagi file dengan menggunakan kelas SharedStorageAccessManager untuk membuat token file yang dapat Anda lewati di antara aplikasi. Misalnya, diberi ValueSet bernama inputData, Anda dapat menyimpan token ke file yang ingin Anda bagikan dengan aplikasi yang diluncurkan:

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

Kemudian teruskan ke aplikasi yang diluncurkan melalui LaunchUriForResultsAsync.