Март 26, 2017 3:07 дп

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;
int diff = nowDate.Subtract(creationDate).Milliseconds;

this.RunOnUiThread(() =>
{
SetPingText(this as Activity, diff.ToString());
});
}
}
catch (ConnectedDevicesException e)
{
Console.WriteLine(«Failed to send message using AppServices»);
e.PrintStackTrace();
}
}

Всю документацию и код Java и Xamarin можно найти на GitHub здесь.

Оставайтесь на связи с Project Rome

Возможности платформы Project Rome направлены на обеспечение связи между устройствами Windows и Android. Благодаря включению служб приложений в пакет SDK для Android мы предоставляем разработчикам необходимые инструменты для создания высокоэффективных приложений.

Узнайте больше о возможностях пакета SDK для Android, ознакомьтесь с примерами кода и изучите дополнительные ресурсы с описанием платформы Project Rome с помощью следующих публикаций:

Команда Windows всегда рада вашим отзывам. Свой отзыв можно оставить на сайте Windows Developer UserVoice. При обнаружении прямой ошибки воспользуйтесь инструментом обратной связи, встроенным в Windows 10.