Intereting Posts
Использование onConfigurationChanged в фрагменте Отключить прокрутку для позиции в RecyclerView с помощью ItemTouchHelper.SimpleCallback Gradle не удалось создать при активации proguard Функциональность панели инструментов панели инструментов Анимация для перехода между представлениями с вращением по оси z с восприятием глубины Использование доступных ресурсов Как использовать разделенные APK, созданные при использовании мгновенного запуска, в самом Android? Android 4.3: BLE: поведение фильтра startLeScan () Как изменить режим вибрации на звонок по программному адресу через аудиоуправление Android Studio не подписывает код для сборки отладки Как читать и редактировать события календаря Android с помощью нового Android 4.0 Ice Cream Sandwich API? Как сделать круговую прокрутку на ViewPager? AlertDialog styling – как изменить стиль (цвет) названия, сообщения и т. Д. Android GoogleAuthUtil.getTokenWithNotification Интерактивный вызов не запускается Использование Jenkins для создания проекта градиента android не выполняется

Обратные вызовы удаленных служб Android

(У меня есть удаленный сервис с интерфейсом AIDL, который используется несколькими клиентскими приложениями.Я хотел бы добавить асинхронный метод к интерфейсу для вызовов, требующих некоторого времени, но мне нужно, чтобы решение было безопасным , что означает, что только мои приложения Могут взаимодействовать с услугой. Клиентские приложения подписываются с той же подписью, что и сервисное приложение. В настоящее время приложения просто привязываются к службе и вызывают метод единого интерфейса для выполнения различных операций.

Один из вариантов – это трансляция намерения из службы при завершении операции и использование BroadcastReceiver в клиентском приложении, но ( вопрос № 1 ) это можно сделать таким образом, чтобы только мои приложения могли получать Intent? SetPackage (), похоже, делает это, но мне нужно поддерживать устройства Gingerbread, которые, как представляется, исключают этот подход в соответствии с ответом здесь: setPackage для намерения в пряниках

Похоже, мне нужно добавить второй интерфейс .aidl с интерфейсом обратного вызова для используемой службы, реализованной клиентом. Я видел примеры, которые используют здесь слушателей, но я не уверен, какая разница в сравнении с клиентом, просто передающая во втором объекте интерфейса как аргумент (как используется в примере IScript / IScriptResult из этого ответа: служебный вызов обращается к активности в Андроид )

Вопрос №2 , в чем преимущество использования слушателя здесь и метода обратного вызова?

Solutions Collecting From Web of "Обратные вызовы удаленных служб Android"

Метод обратного вызова / прослушиватель – это правильная вещь. (Как говорит CommonsWare, это почти то же самое). Я бы сказал, что это намного проще, чем играть с BroadcastReceivers, так как вы уже используете helpl.

Что-то вроде этого:

IAsyncThing.aidl:

package com.my.thingy; import com.my.thingy.IAsyncThingListener; interface IAsyncThing { void doSomething(IAsyncThingListener listener); } 

IAsyncThingListener.aidl:

 package com.my.thingy; import com.my.thingy.IAsyncThingListener; interface IAsyncThingListener { void onAsyncThingDone(int resultCodeIfYouLike); } 

Вы можете обеспечить, чтобы только ваши приложения могли связываться с сервисом, используя разрешения на уровне подписки на вашу службу (см. Примечание к «разрешениям на обслуживание» здесь: http://developer.android.com/guide/topics/security/permissions .html ). В частности:

  • Объявите разрешение в AndroidManifest.xml вашего сервиса. Убедитесь, что это уровень signature .
  • Добавьте это разрешение в свой тег service
  • Во всех других приложениях используйте uses-permission на его использование.

Еще несколько вещей, которые нужно иметь в виду:

  • В вызывающем абоненте вам потребуется подкласс IAsyncThingListener.Stub . Код вашего вызывающего приложения уже может быть подклассифицирован другим, так что это означает, что вам нужно будет использовать дополнительный (возможно, внутренний) класс для получения уведомления о завершении. Я упоминаю об этом только потому, что это может быть ответ на вопрос № 2, который я не совсем понимаю.
  • Если служба потенциально находится в разных процессах от вызывающего, каждый должен зарегистрироваться для уведомления о смерти другого, используя IBinder.linkToDeath .