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:
- opsional—Aplikasi dapat diluncurkan untuk hasil dengan menggunakan metode LaunchUriForResultsAsync , atau tidak untuk hasil dengan menggunakan LaunchUriAsync. Saat Anda menggunakan opsional, aplikasi yang diluncurkan harus menentukan apakah aplikasi diluncurkan untuk hasil. Ini dapat melakukannya dengan memeriksa argumen peristiwa Aktif . Jika properti IActivatedEventArgs.Kind argumen mengembalikan ActivationKind.ProtocolForResults, atau jika jenis argumen peristiwa adalah ProtocolActivatedEventArgs, aplikasi diluncurkan melalui LaunchUriForResultsAsync.
- selalu—Aplikasi hanya dapat diluncurkan untuk hasil; artinya, ini hanya dapat merespons LaunchUriForResultsAsync.
- none—Aplikasi tidak dapat diluncurkan untuk hasil; ini hanya dapat merespons LaunchUriAsync.
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.
Topik terkait
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk