Project Rome для Android Update — теперь с поддержкой App Services
Разработчики Project Rome в течение месяца тестировали комплект средств разработки Project Rome SDK для Android. Надеемся, что вам также понравятся его возможности! В релиз этого месяца мы включили поддержку служб приложений (app services). Раньше у пользователей была возможность запускать идентификаторы URI с устройства Android на устройстве Windows. Однако в этом комплекте средств разработки были ограничения на отправку URI. Благодаря поддержке служб приложений теперь вы сможете с легкостью обмениваться сообщениями между устройствами Android и Windows. Рассказывает руководитель группы проектов Кармен Форсман (Carmen Forsmann).
Что такое службы приложений?
В двух словах, службы приложений позволяют приложениям взаимодействовать друг с другом. Таким образом, приложения Android могут посредством служб приложений незаметно выполнять различные задачи в приложениях Windows. Эта статья посвящена использованию служб приложений для взаимодействия устройств Android и Windows. Подробнее о службах приложений для Windows можно прочитать здесь.
Обмен сообщениями между подключенными устройствами
Вернемся к старому примеру из февральской публикации в англоязычном блоге. Разработчик приложений по имени Пол интегрировал пакет SDK для Android в свое музыкальное приложение Contoso, что позволяет без задержек запускать его на различных устройствах. Для реализации этой замечательной возможности в своем приложении Пол использовал API-интерфейсы RemoteLaunch. У Пола есть телефон Android, и он обычно слушает музыку во время пробежки. Вернувшись домой, он может с легкостью запустить свое приложение на Xbox c акустической системой и прослушивать записи в лучшем качестве.
Когда Пол дома, он часто вынужден подходить к Xbox, чтобы переключать записи, и ему это не нравится. Обычно он загружает весь плей-лист, а затем под настроение выбирает из него то одну песню, то другую. В этом случае приходят на помощь службы приложений.
Теперь Пол может управлять музыкальным приложением, работающим на Xbox, со своего телефона Android. Это очень удобно, поскольку Пол всегда носит телефон с собой, и ему не нужно каждый раз подходить к Xbox, чтобы включить другую песню. После того как приложение Android устанавливает соединение AppServiceClientConnection, устройства могут обмениваться сообщениями.
Посмотрим на службу приложений в Android SDK в коде.
Во-первых, нужно обнаружить устройства с помощью RemoteSystemDiscovery для запроса соединения connectionRequest.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// Create a RemoteSystemDiscovery object with a Builder RemoteSystemDiscovery.Builder discoveryBuilder;// Implement the IRemoteSystemDiscoveryListener to be used for the callback discoveryBuilder = new RemoteSystemDiscovery.Builder().setListener(new IRemoteSystemDiscoveryListener() { @Override public void onRemoteSystemAdded(RemoteSystem remoteSystem) { Log.d(TAG, «RemoveSystemAdded = » + remoteSystem.getDisplayName()); devices.add(new Device(remoteSystem)); } }); // Start discovering devices startDiscovery(); |
Во-вторых, устанавливается AppServiceClientConnection. IAppServiceClientConnectionListener обрабатывает состояние соединения, а IAppServiceResponseListener обрабатывает ответ на сообщение.
AppServiceClientConnection
1 2 3 4 5 6 7 |
// Create an AppServiceClientConnection private void connectAppService(Device device) { _appServiceClientConnection = new AppServiceClientConnection(APP_SERVICE, APP_IDENTIFIER, new RemoteSystemConnectionRequest(device.getSystem()), new AppServiceClientConnectionListener(), new AppServiceResponseListener()); |
AppServiceClientConnection callback
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
// Implement the IAppServiceClientConnectionListener used to callback // the AppServiceClientConnection private class AppServiceClientConnectionListener implements IAppServiceClientConnectionListener {// Handle the cases for success, error, and closed connections @Override public void onSuccess() { Log.i(TAG, «AppService connection opened successful»); } @Override public void onError(AppServiceClientConnectionStatus status) { Log.e(TAG, «AppService connection error status = » + status.toString()); }@Override public void onClosed() { Log.i(TAG, «AppService connection closed»); }} |
AppServiceClientResponse callback
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
// Implement the IAppServiceResponseListener used to callback // the AppServiceClientResponse private class AppServiceResponseListener implements IAppServiceResponseListener() { @Override public void responseReceived(AppServiceClientResponse response) { AppServiceResponseStatus status = response.getStatus();if (status == AppServiceResponseStatus.SUCCESS) { Bundle bundle = response.getMessage(); Log.i(TAG, «Received successful AppService response»);String dateStr = bundle.getString(«CreationDate»);DateFormat df = new SimpleDateFormat(DATE_FORMAT); try { Date startDate = df.parse(dateStr); Date nowDate = new Date(); long diff = nowDate.getTime() — startDate.getTime(); runOnUiThread(new SetPingText(Long.toString(diff))); } catch (ParseException e) { e.printStackTrace(); } } else { Log.e(TAG, «Did not receive successful AppService response); } } } |
Xamarin
Это еще не все: мы также обновили Xamarin для Android, добавив службы приложений.
Как показано в примере, следующие две функции используются в классе RemoteSystemActivity для установки соединения, а затем для проверки связи посредством служб приложений.
AppServiceClientConnection
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
private async void ConnectAppService(string appService, string appIdentifier, RemoteSystemConnectionRequest connectionRequest) { // Create AppServiceClientConnection this.appServiceClientConnection = new AppServiceClientConnection(appService, appIdentifier, connectionRequest); this.id = connectionRequest.RemoteSystem.Id;try { // OpenRemoteAsync returns a Task<AppServiceClientConnectionStatus> var status = await this.appServiceClientConnection.OpenRemoteAsync(); Console.WriteLine(«App Service connection returned with status » + status.ToString()); } catch (ConnectedDevicesException e) { Console.WriteLine(«Failed during attempt to create AppServices connection»); e.PrintStackTrace(); } } |
SendMessageAsync
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
private async void SendPingMessage() { // Create the message to send Bundle message = new Bundle(); message.PutString(«Type», «ping»); message.PutString(«CreationDate», DateTime.Now.ToString(CultureInfo.InvariantCulture)); message.PutString(«TargetId», this.id);try { var response = await this.appServiceClientConnection.SendMessageAsync(message); AppServiceResponseStatus status = response.Status;if (status == AppServiceResponseStatus.Success) { // Create the response to the message Bundle bundle = response.Message; string type = bundle.GetString(«Type»); DateTime creationDate = DateTime.Parse(bundle.GetString(«CreationDate»)); string targetId = bundle.GetString(«TargetId»); DateTime nowDate = DateTime.Now; this.RunOnUiThread(() => |
Всю документацию и код Java и Xamarin можно найти на GitHub здесь.
Оставайтесь на связи с Project Rome
Возможности платформы Project Rome направлены на обеспечение связи между устройствами Windows и Android. Благодаря включению служб приложений в пакет SDK для Android мы предоставляем разработчикам необходимые инструменты для создания высокоэффективных приложений.
Узнайте больше о возможностях пакета SDK для Android, ознакомьтесь с примерами кода и изучите дополнительные ресурсы с описанием платформы Project Rome с помощью следующих публикаций:
- Project Rome for Android SDK
- GitHub for Project Rome for Android SDK
- MSDN Communicate with a remote app service
Команда Windows всегда рада вашим отзывам. Свой отзыв можно оставить на сайте Windows Developer UserVoice. При обнаружении прямой ошибки воспользуйтесь инструментом обратной связи, встроенным в Windows 10.