Iredial приложение как работает
загрузить и установить iReDial на вашем персональном компьютере и Mac
Проверить совместимые приложения для ПК или альтернативы
Или следуйте инструкциям ниже для использования на ПК
Если вы хотите установить и использовать iReDial на вашем ПК или Mac, вам нужно будет загрузить и установить эмулятор Desktop App для своего компьютера. Мы усердно работали, чтобы помочь вам понять, как использовать app для вашего компьютера в 4 простых шагах ниже:
Шаг 1: Загрузите эмулятор Android для ПК и Mac
Хорошо. Прежде всего. Если вы хотите использовать приложение на своем компьютере, сначала посетите магазин Mac или Windows AppStore и найдите либо приложение Bluestacks, либо Приложение Nox . Большинство учебных пособий в Интернете рекомендуют приложение Bluestacks, и у меня может возникнуть соблазн рекомендовать его, потому что вы с большей вероятностью сможете легко найти решения в Интернете, если у вас возникнут проблемы с использованием приложения Bluestacks на вашем компьютере. Вы можете загрузить программное обеспечение Bluestacks Pc или Mac here .
Шаг 2: установите эмулятор на ПК или Mac
Теперь, когда вы загрузили эмулятор по вашему выбору, перейдите в папку «Загрузка» на вашем компьютере, чтобы найти приложение эмулятора или Bluestacks.
Как только вы его нашли, щелкните его, чтобы установить приложение или exe на компьютер или компьютер Mac.
Теперь нажмите «Далее», чтобы принять лицензионное соглашение.
Чтобы правильно установить приложение, следуйте инструкциям на экране.
Если вы правильно это сделаете, приложение Emulator будет успешно установлено.
Шаг 3: iReDial для ПК - Windows 7/8 / 8.1 / 10/ 11
Теперь откройте приложение Emulator, которое вы установили, и найдите его панель поиска. Найдя его, введите iReDial в строке поиска и нажмите «Поиск». Нажмите на iReDialзначок приложения. Окно iReDial в Play Маркете или магазине приложений, и он отобразит Store в вашем приложении эмулятора. Теперь нажмите кнопку «Установить» и, например, на устройстве iPhone или Android, ваше приложение начнет загрузку. Теперь мы все закончили.
Вы увидите значок под названием «Все приложения».
Нажмите на нее, и она перенесет вас на страницу, содержащую все установленные вами приложения.
Вы должны увидеть . Нажмите на нее и начните использовать приложение.
Шаг 4: iReDial для Mac OS
Привет. Пользователь Mac!
Шаги по использованию iReDial для Mac точно такие же, как для ОС Windows выше. Все, что вам нужно сделать, это установить Nox Application Emulator или Bluestack на вашем Macintosh. Вы можете получить Это здесь .
Спасибо за чтение этого урока. Хорошего дня!
Получить совместимый APK для ПК
iReDial На iTunes
iReDial Особенности и описания
Люди, которые постоянно заняты и не имеют возможности находиться у телефона в любой момент, часто пользуются функцией автодозвона. Она упрощает жизнь пользователя, экономя время и нервы человека. Есть ли такая функция на телефонах с системой iOS и как её при необходимости включить?
Что такое автодозвон на iPhone
Автоматический дозвон – это полезная и нужная функция. Её плюс заключается в том, что айфон сам перезванивает на номер пользователя, если абонент не дозвонился. Если гаджет столкнется с занятой линией, отклонением вызова или игнорированием звонка, то он будет набирать этого абонента снова.
Автодозвон на iPhone – необходимое действие, которое помогает большому количеству занятых людей совершать многочисленные наборы номера без самостоятельных манипуляций. Если автодозвон столкнется с занятой линией, то он повторит набор номера. Это может продолжаться до тех пор, пока оператор не примет вызов и не соединит абонентов.
Обратите внимание! Ассистент может сделать столько номеров, сколько запрограммирует пользователь.
Активация этой функции существенно экономит время, платформа для коммуникации на айфонах стала в разы удобнее. Простой пример применения данного функционала – звонок в больницу.
Если подключить автодозвон, то не нужно постоянно набирать номер больницы, которая обсуживает большое количество людей ежедневно и редко отвечает на звонки. Автодозвон можно также применять:
- В бытовых делах, когда нужно позвонить в ту же самую больницу или заказать еду на дом.
- На работе, когда важный клиент не отвечает в самый нужный момент.
- В личной жизни, если пользователь просто не может дозвониться до абонента.
Автодозвон на айфоне полезен тем, что не только экономит время, но и освобождает его для более важных дел, чем постоянный набор одного и того же номера. Функционал велик, но как правильно поставить автодозвон на айфоне и где найти эту функцию?
Ожидание ответа на вызов
Автодозвон: включение на айфоне разными способами
К большому сожалению многих владельцев телефонов на системе iOS в них не предусмотрена такая функция, как автодозвон. В интернете существует большое количество слухов, опровергающих то, что на айфоне есть такой функционал, но искать его нет смысла.
Важно! Такой опции компания Apple не внесла на все свои модели и системы.
То, что такой опции не существует в системе не означает, что её нельзя подключить с помощью других популярных методов. На Андроиде функция называется iRedial, а на телефоне с системой iOS данную опцию можно подключить с помощью:
- взлома телефона;
- различных приложений;
- голосового помощника Siri.
Других способов, к сожалению, чтобы установить автодозвон на айфоне просто не существует.
Первый способ включаться в инструкцию не будет, так как он не официальный и может принести большой вред устройству пользователя. Стоит рассмотреть на примере iPhone 6 установку с помощью приложения iRedial.
Включение автодозвона на iPhone 6 с помощью сторонних приложений
Если рассматривать другие приложения из официального источника, то iRedial – самый лучший вариант из всех из-за того, что:
- имеет относительно приемлемую стоимость за необходимую функцию;
- доступно в официальном источнике. Это значит, что у вирусов нет шанса пробраться в iPhone;
- хороший функционал, который позволяет совершать все необходимые задачи за пользователя.
Функционал приложения на айфоне iRedial
Этот популярный софт стал любим многими владельцами айфона, так как с его помощью можно совершать многочисленные звонки, а также фиксировать их количество. Функционала достаточно, чтобы дозвониться до человека в нужный момент. Программа может:
- Звонить абоненту фиксированное количество раз до тех пор, пока тот не возьмет трубку.
- Звонить неограниченное количество раз.
- Совершать автоматические наборы номера только в тех случаях, когда пользователь находится в зоне действия сети и может фактически ответить на звонок.
Обратите внимание! Чтобы подключить опцию автоматического дозвона с помощью приложения, нужно для начала скачать его из официального источника. После установки надо открыть приложение и следовать той инструкции, которая будет предложена программой.
В настройках можно менять режим. Устанавливается автоматический дозвон таким образом:
- Следует открыть приложение.
- Найти кнопку «Набор номера».
- Подключить контактную книжку к приложению.
- Выбрать из контактной книжки или самостоятельно вбить номер.
- Выбрать то количество раз, которое программа будет звонить абоненту.
- Нажать на трубку и ждать ответа.
Если пользователь сможет настроить определенное количество, то приложение на iPhone сделает дозвон ровно столько раз, сколько выбрал человек.
Как включить и отключить автоматический дозвон на старых версиях телефонов iOS методом джейлбрек
На старых версиях телефона с системой iOS можно также использовать вышеупомянутое приложение, но есть и другой метод – твик KuaiDial. Эта опция доступна только на взломанных аппаратах. Если у пользователя телефон не взломан, то единственный выход – установка сторонних приложений или использование голосового помощника, о котором будет говориться далее.
Твик-способ помогает пользователю с помощью стандартного приложения «Телефон» получить несколько дополнительных опций, в разряд которых также входит перезвон номеру абонента.
Важно! Не стоит верить тем статьям и слухам в интернете, которые говорят о том, что функцию автоматического дозвона можно подключить через «Настройки». Компания Apple не ввела такую опцию, поэтому пользователю доступны только сторонние варианты подключения, а не системные.
Функция Твик переключается обычным переходом ползунка на взломанных айфонах. Джейлбрейк устройства позволяет внести некоторые дополнительные методы связи с абонентом. Не должно возникнуть проблем с тем, как правильно отключить автодозвон на iPhone и убрать эту функцию. Достаточно кликнуть на ползунок.
Вирусы на телефоне
Как решить проблему, когда айфон сам перезванивает, если пользователь не дозвонился
Бывают случаи, когда айфон решает сам перезванивать абоненту без участия и манипуляций со стороны владельца телефона. Эта проблема, которая имеет несколько причин:
- За пользователем могут следить. Это возможно тогда, когда вся информация о манипуляциях с телефоном передается на «другую» сторону.
- Различные вирусы. Некоторые вредоносные программки могут названивать другому абоненту. Решить эту проблему можно только с помощью программиста или приложений, которые специализируются на удаление вирусов.
- Синхронизировались номера с другого устройства. Подключенное ID на нескольких гаджетах может показать ошибку и названивать другому человеку. Чтобы устранить эту причину, нужно отключить синхронизацию на всех устройствах и подключить её снова.
- Наличие джейлбрейка. Если операционная система взломана, то это большая опасность для телефона. Удалить джейбрекинг – выход из ситуации.
- У пользователя может быть некачественный экран, который провоцирует постоянные замыкания. Решение – поменять экран и сделать качественный ремонт.
- Включен автоматический дозвон в приложении. Такое возможно, если пользователь забыл о том, что недавно установил данную опцию. В зависимости от приложения, которое установлено в качестве способа дозвона, нужно отключить в настройках автоматический набор и проблема решится.
Решив одну из этих проблем, пользователь со 100% вероятностью избавится от того, что телефон будет самостоятельно набирать абоненту.
Как перезвонить абоненту с помощью голосового ассистента Siri
Еще один популярный и максимально удобный способ – использование голосового помощника Siri. Умный ассистент способен на многие опции, в том числе совершать неограниченное количество звонков. Синхронизация с устройством помогает ассистенту без труда подключать номера абонентов, звонить им, а также перезванивать в случае необходимости.
Голосовой помощник – хороший инструмент для автодозвона, так как:
- Нет необходимости в скачивании дополнительных сервисов или опций.
- Это безвредный вариант, поскольку через Сири невозможно поймать какие-либо вирусы.
- Голосовой помощник есть на любом айфоне, даже на самых старых версиях.
Функционал Siri в качестве повторного звонка
Чтобы человек мог поставить автоматический набор телефона абонента, нужно выполнить несколько интуитивных шагов:
- Разблокировать айфон привычным для человека способом. Это может быть как ввод пароля, так и нажатие главной кнопки «Дом».
- Далее нужно удерживать домашнюю кнопку, чтобы вызвать голосового ассистента.
- Необходимо сказать Сири команду: «Позвони по номеру (имя того человека, которому необходимо совершить звонок)».
- Если пользователь не отвечает и не берет трубку, то следует попросить голосового помощника перезвонить ещё раз фразой: «Позвони еще раз».
- Обращаться этой фразой к голосовому помощнику после каждого не отвеченного звонка до того момента, пока человек на другом конце провода не возьмет трубку или сам не сможет выключить вызов.
Обратите внимание! В случае с Siri невозможен автоматический дозвон. Только с проговариванием фразы «Позвони еще раз» можно позвонить по тому же номеру без набора.
В настройках устройства можно совершать набор и без разблокировки экрана. Найти эту опцию необходимо в разделе «Настройка голосового помощника».
Как выяснилось, автоматический дозвон возможен на телефоне с системой iOS только в нескольких вариантах: при помощи приложений, взлома или голосового ассистента. Каждый пользователь выбирает для себя более удобный способ, который подходит ему. Совершать или отключать дополнительные звонки на айфоне проще, чем может показаться на первый взгляд.
Looking for a secretary to remind you the important calls to do ?
Looking for a calls scheduler to remind you at the proper and ?
Get iReDial and make your life easier.
After all, the iPhone is still a telephone: remember ?
With iReDial all you need to do is type the phone number and set when you want to call.
NOTE: iReDial is NOT an automatic dialer. It simply notifies you of the phone calls you decided to postpone. At the notification, you decide whether to call.
iReDial main features include:
. access to your iPhone s
. call delay programmable from 1 minute to whatever you wish
. select planned calls for Tomorrow, Tomorrow evening, Weekend, the Next week and any other and
. all default s for Tomorrow, Tomorrow evening, in the Weekend, the Next week, are user selectable
. favorite s folder
. recent calls folder
. notifications also when the iPhone is on standy
. Split View and Slide Over multitasking mode supported in devices where available
The free version is installed with 10 free dials tokens.
A token is consumed at the a call is answered.
In the app you can purchase more tokens or the Premium version that removes any need for getting tokens to call. Ever.
iReDial: your new professional secretary !
IReDial
Приложение не дозванивается, это просто напоминалка привязанная к Вашему списку контактов
Напоминалка, а не звонилка
Бесполезно. Напоминалки у меня в календарях, а сама звонить эта штука не умеет.
Будильник
Зачем мне еще один будильник в телефоне? Как звонить через это убогое приложение?
Конфиденциальность приложения
Разработчик iStArtApp указал, что в соответствии с политикой конфиденциальности приложения данные могут обрабатываться так, как описано ниже. Подробные сведения доступны в политике конфиденциальности разработчика.
Не связанные с пользователем данные
Может вестись сбор следующих данных, которые не связаны с личностью пользователя:
- Данные об использовании
- Диагностика
Конфиденциальные данные могут использоваться по-разному в зависимости от вашего возраста, задействованных функций или других факторов. Подробнее
Информация
Провайдер Stefano Tosi Размер 11,7 МБ Совместимость iPhone Требуется iOS 13.0 или новее. iPad Требуется iPadOS 13.0 или новее. iPod touch Требуется iOS 13.0 или новее. Возраст 4+ Copyright © 2020 iStartApp Цена Бесплатно Встроенные покупки
- Remove 99,00 ₽
- Premium: unlimited calls 649,00 ₽
- 50 tokens for dials 179,00 ₽
- 20 tokens for dials 99,00 ₽
- 150 tokens for dials 379,00 ₽
- Сайт разработчика
- Поддержка приложения
- Политика конфиденциальности
Поддерживается
Семейный доступ
С помощью семейного доступа приложением смогут пользоваться до шести участников «Семьи».
Другие приложения этого разработчика
Вам может понравиться
загрузить и установить iReDial на вашем персональном компьютере и Mac
Проверить совместимые приложения для ПК или альтернативы
Или следуйте инструкциям ниже для использования на ПК
Если вы хотите установить и использовать iReDial на вашем ПК или Mac, вам нужно будет загрузить и установить эмулятор Desktop App для своего компьютера. Мы усердно работали, чтобы помочь вам понять, как использовать app для вашего компьютера в 4 простых шагах ниже:
Шаг 1: Загрузите эмулятор Android для ПК и Mac
Хорошо. Прежде всего. Если вы хотите использовать приложение на своем компьютере, сначала посетите магазин Mac или Windows AppStore и найдите либо приложение Bluestacks, либо Приложение Nox . Большинство учебных пособий в Интернете рекомендуют приложение Bluestacks, и у меня может возникнуть соблазн рекомендовать его, потому что вы с большей вероятностью сможете легко найти решения в Интернете, если у вас возникнут проблемы с использованием приложения Bluestacks на вашем компьютере. Вы можете загрузить программное обеспечение Bluestacks Pc или Mac here .
Шаг 2: установите эмулятор на ПК или Mac
Теперь, когда вы загрузили эмулятор по вашему выбору, перейдите в папку «Загрузка» на вашем компьютере, чтобы найти приложение эмулятора или Bluestacks.
Как только вы его нашли, щелкните его, чтобы установить приложение или exe на компьютер или компьютер Mac.
Теперь нажмите «Далее», чтобы принять лицензионное соглашение.
Чтобы правильно установить приложение, следуйте инструкциям на экране.
Если вы правильно это сделаете, приложение Emulator будет успешно установлено.
Теперь откройте приложение Emulator, которое вы установили, и найдите его панель поиска. Найдя его, введите iReDial в строке поиска и нажмите «Поиск». Нажмите на iReDialзначок приложения. Окно iReDial в Play Маркете или магазине приложений, и он отобразит Store в вашем приложении эмулятора. Теперь нажмите кнопку «Установить» и, например, на устройстве iPhone или Android, ваше приложение начнет загрузку. Теперь мы все закончили.
Вы увидите значок под названием «Все приложения».
Нажмите на нее, и она перенесет вас на страницу, содержащую все установленные вами приложения.
Вы должны увидеть . Нажмите на нее и начните использовать приложение.
Шаг 4: iReDial для Mac OS
Привет. Пользователь Mac!
Шаги по использованию iReDial для Mac точно такие же, как для ОС Windows выше. Все, что вам нужно сделать, это установить Nox Application Emulator или Bluestack на вашем Macintosh. Вы можете получить Это здесь .
Спасибо за чтение этого урока. Хорошего дня!
Получить совместимый APK для ПК
iReDial Особенности и описания
Dialer Pro
4+
Снимки экрана (iPhone)
Предлагаем вашему вниманию практичную Т9 умную клавиатуру. Умная клавиатура как классические часы, основная задача которых является соединить вас с контактом при наименьшем количестве кликов. Не зависимо от того в движении вы или нет, являетесь ли вы гуру набора одной рукой или мастер набора двумя руками, имеете ли вы большой дисплей или маленький, ваш список контактов всегда будет находится на расстоянии в несколько кликов с Dialer Pro.
Простой и чистый дизайн
Красивый минималистичный дизайн полностью нацелен на совершение звонков.
Умный и быстрый поиск
Поиск контактов в несколько тапов с помощью разумного поиска.
У всех есть избранные
Смахните контакт налево для того чтобы добавить Ваших друзей и родственников в избранное.
Выбор остается за вами
Настройте приложение так, как вам удобно.
Мы естественно не ограничиваемся вышеперечисленными. Наша команда непрерывно работает над усовершенствованием.
В настоящее время мы поддерживаем английский, немецкий, испанский, итальянский, французский, португальский, турецкий, русский, польский, вьетнамский, хинди и арабский языки.
Если вы хотите добавить свой родной язык, свяжитесь с нами через приложение, и мы добавим его в кратчайшие сроки.
Будьте с нами и вас ждёт много нового и интересного!
Весёлого набора
Команда Dialer Pro
Благодарим вас за выбор Dialer Pro! Мы всегда прислушиваемся к вашим отзывам и обновляем наше приложение, чтобы улучшить взаимодействие с пользователем.
В этой версии: мы исправили ошибки и повысили производительность. Исправлена проблема с подпиской. Добавлено множество новых функций:
1) Планирование напоминания.
2) Настройка экрана по умолчанию.
3) Назначение контакту номера быстрого набора.
Включите обновления, чтобы ничего не пропустить.
Проблема с буквой ё. И поддержу 2сим
Ребята в русском есть буква Ё она находится на цифре 3 в наборе. Пожалуйста добавьте поддержку данной буквы. И конечно бы очень хотелось поддержку 2 сим. Например две кнопки вызов с 1 сим и 2 сим.
Спасибо за оценку и отзыв. Букву Ё обязательно добавим. Мы постоянно работаем над новыми функциями и ваш запрос по поводу 2х сим карт рассмотрим и по возможности включим в будущих обновлениях.
Dialer
Очередной раз убеждаюсь, что для айфона программы просто отстойные. Перехожу обратно на андроид.
Зачем программа делает несколько контактов из одного если у абонента несколько номеров записано?
Спасибо за отзыв. Текущее поведение контактов является конструктивным. Выполнить поиск T9 с группировкой не так-то просто. Однако мы работаем над решением некоторых проблем. Мы выпустим обновление, сразу когда стабильная версия будет готова.
Конфиденциальность приложения
Разработчик Plan B Commerce указал, что в соответствии с политикой конфиденциальности приложения данные могут обрабатываться так, как описано ниже. Подробные сведения доступны в политике конфиденциальности разработчика.
Не связанные с пользователем данные
Может вестись сбор следующих данных, которые не связаны с личностью пользователя:
- Контактные данные
- Контакты
- Идентификаторы
- Диагностика
Конфиденциальные данные могут использоваться по-разному в зависимости от вашего возраста, задействованных функций или других факторов. Подробнее
Информация
Провайдер Plan B Commerce Pty Ltd Размер 40,9 МБ Совместимость iPhone Требуется iOS 13.0 или новее. iPod touch Требуется iOS 13.0 или новее. Языки
русский, английский, арабский, вьетнамский, индонезийский, испанский, итальянский, корейский, немецкий, польский, португальский, турецкий, французский, хинди, японский
Возраст 4+ Copyright © Plan B Commerce Цена Бесплатно Встроенные покупки
- Yearly ption 149,00 ₽
- Поддержка приложения
- Политика конфиденциальности
Поддерживается
Семейный доступ
С помощью семейного доступа приложением смогут пользоваться до шести участников «Семьи».
Совсем недавно у меня появилась необходимость разработать функционал для взаимодействия между двумя приложениями одной компании, и недолго гуглив я открыл для себя мир межпроцессного взаимодействия в андройд - AIDL.
О существовании AIDL я знал довольно давно, однако до этого момента с IPC в андройде не сталкивался, и этот опыт был для меня первым.
В этой статье не будет каких-либо низкоуровневых подробностей о работе IPC в андройд, здесь я расскажу об AIDL с точки зрения обычного разработчика - о трудностях с которыми пришлось столкнуться и об их решении. А ещё поделюсь полезными кусочками кода, которые помогут вам сохранить пару часов кодинга.
Как это работает на примере калькулятора
В основе взаимодействия лежит bound-сервис, предоставляющий сторонним приложениям доступ к определенному набору методов. Другими словами, одно приложение выступает в роли "клиента" а другое в роли "сервера", причем общаются они по строго заданному интерфейсу, который идентичен для обоих приложений.
Чтобы разобраться с основами, давайте напишем простое приложение-калькулятор, а потом перейдем к более сложным примерам.
Итак, имеем два модуля-приложения: :app-server и :app-client , из названия понятно кто за что отвечает.
Для связи между двумя процессами необходимо иметь одинаковые AIDL интерфейсы в обоих приложениях, поэтому дабы не дублировать код, создадим общий модуль :aidl и подключим его к обоим приложениям.
Далее в приложении-сервере нам необходимо написать тот самый bound-сервис, через который и будет происходить общение между нашими приложениями. В единственном методе сервиса onBind пока-что будем возвращать null .
Теперь перейдем к самой работе с AIDL. В модуле :aidl в папке src/main/aidl/*пакет приложения* создадим файл Calculator.aidl , в котором напишем интерфейс имеющий всего один метод сложения чисел:
Синтаксис в AIDL такой же как в Java, за исключением некоторых особенностей о которых мы поговорим по ходу статьи.
Однако первое что вы заметите при написании AIDL-интерфейса, так это его плохую поддержку в Android Studio - забудьте про автодополнение кода, автоматическую подмену импортов и пакета при перемещении файла, да черт, там даже подсветка для JavaDoc-комментариев отсутствует! Очень разочаровало.
Во время сборки проекта у нас запустится gradle-таск, который сгенерирует java-интерфейс содержащий в себе логику IPC транзакций. О его внутренностях нам знать не обязательно, нас интересует абстрактный класс Calculator.Stub который является наследником android.os.IBinder , его-то мы и должны будем вернуть в методе onBind нашего bound-сервиса. Теперь сервис будет выглядеть следующим образом:
Осталось только подключиться к нему на стороне клиента и вызвать метод sum(first, second) .
Чтобы мы смогли подключиться к сервису он должен быть доступен сторонним приложениям, поэтому добавим ему в манифест интент-фильтр:
Название экшена роли не играет, единственное для чего он нужен так это для подключения. Имя процесса указывать необязательно.
Также для подключения требуется отправлять явный (explicit) Intent, т.е он обязан содержать имя пакета и полный путь к классу сервиса, для этого напишем следующий метод:
Создание явного интента
Также, начиная с Android 11 для подключения к сервису в клиентском приложении требуется указать в манифесте тег <queries> и прописать туда <action> сервиса, к которому мы будем подключаться.
Ну и последнее что осталось сделать - реализовать интерфейс ServiceConnection , в котором полученный объект типа android.os.IBinder мы приведём к нашему типу com.example.aidl.Calculator :
Всё! Теперь у нас есть объект calculator , методы которого выполняются в другом приложении. Вызвав метод calculator.sum(2, 2) на выходе получим 4.
Помните о том, что вместо сложения чисел тут могут быть абсолютно любые задачи, например отправка запросов на сервер или чтение базы данных, всё ограничивается лишь вашей фантазией.
Кейс по-сложнее №1 - модель данных
С простым кейсом разобрались, но что если на выходе нужно возвращать не int , а свой тип? Тут мы начинаем сталкиваться с первыми ограничениями.
В AIDL поддерживаются следующие типы данных:
• Все примитивы из Java ( int , long , char , boolean и т.д)
• Массивы примитивов ( int[] и т.д.)
• Строковые типы CharSequence и String
• List<T> содержащий данные типа из этого списка
• Map<*, *> содержащий данные типа из этого списка, но без параметризации! Т.е не получится написать Map<String, Integer> - компилятор выдаст ошибку
• Parcelable классы, в том числе Bundle
• Другие AIDL-интерфейсы (рассмотрим чуть позже)
Поддержка Parcelable меня очень обрадовала, ведь можно писать обычные data классы c аннотацией @Parcelize и сразу же иметь возможность передавать их между процессами, это ли не чудо?!
Давайте усложним наш пример с калькулятором, и будем возвращать не int напрямую, а модель с результатом:
Описание Parcelable прямо в AIDL
В официальной документации сказано, что начиная с Android 10 появилась возможность описания Parcelable классов напрямую в AIDL, однако по какой-то мистической причине у меня это не работает.
В любом случае я бы не советовал использовать такой подход, ведь в итоге вы лишаетесь возможности декларировать методы в классе.
Чтобы использовать этот класс в AIDL, необходимо создать для него файл-заглушку, причем пакет файла .aidl должен совпадать с пакетом файла .kt. Выглядит это так:
Меня это сильно насторожило - неужели обязательно создавать ещё один файл с таким же названием и пакетом, в дополнение к тому файлу что мы уже создали?
- Да, обязательно. Однако есть один "лайфхак" для ленивых вроде меня, его мы рассмотрим в конце статьи
Теперь наш калькулятор будет выглядеть следующим образом:
Самое главное - не забывайте про импорты, ведь их придется писать руками, и даже автодополнение вам не поможет.
Кейс по-сложнее №2 - асинхронные вызовы
Если выполнение метода sum(first, second) будет занимать много времени, в конечном счете мы получим зависания на UI треде, а что ещё хуже - ANR. Для избежания такой ситуации можно вынести выполнение метода на другой поток, а результат выполнения возвращать через Callback.
Напишем AsyncCallback.aidl в котором будем получать результат Sum :
Про ключевые слова in/out/inout
Ключевые слова in/out/inout позволяют Binder'у пропустить определенный этап маршаллинга данных, повышая производительность IPC транзакций.
Рассмотрим следующий пример - у нас есть метод требующий на вход массив строк помеченный ключевым словом in :
На стороне клиента мы заполняем этот массив какими-либо данными, например "Cat" и "Dog", а на стороне сервера изменяем значения этих строк на "Apple" и "Strawberry".
Изменится-ли массив на стороне клиента после манипуляций на стороне сервера? Нет, не изменится, потому что in как бы "ограничивает" доступ к оригинальному массиву. Однако на стороне сервера массив будет изменён.
Как вы наверное уже догадались, чтобы массив обновился на стороне клиента мы должны пометить его ключевым словом inout - таким образом на стороне сервера будет доступ как на чтение массива, так и на запись.
Ещё есть ключевое слово out , его отличие от inout в том что массив на стороне клиента будет заполнен теми значениями, которые были установлены на стороне сервера. Пример - на стороне клиента передаем массив из "Cat" и "Dog", а на стороне сервера с массивом ничего не делаем. После выполнения метода оригинальный массив будет содержать null , потому что приложение-сервер его не заполнило.
Учтите что все примитивы в AIDL по-умолчанию помечены словом in , и вы не можете использовать для них свойство out или inout . Но если у вас всё же возникла такая необходимость, рассмотрите вариант использования списка или массива.
Теперь обновим основной класс калькулятора c использованием нового коллбека:
Как видим, созданные AIDL-интерфейсы можно использовать внутри других AIDL-интерфейсов, причем модификатор in указывать необязательно - он будет установлен по-умолчанию.
Далее останется лишь запустить в сервисе асинхронную операцию и вернуть результат в callback.onSuccess(sum) , на этом всё.
Ключевое слово oneway
В предыдущем примере мы запускали задачу в отдельном потоке внутри bound-сервиса, но в AIDL также предусмотрена возможность выполнения самого метода sum(first, second) в другом потоке, для этого его нужно пометить ключевым словом oneway :
Больше от нас действий не требуется, но учтите, что тоже самое работает и в "обратную" сторону, т.е результат операции также будет получен в другом потоке.
Ещё тут присутствует один неочевидный момент - если клиент и сервер находятся в одном процессе, то такой метод будет выполнен синхронно.
Кейс с закрытием приложения
Официальная документация советует нам всегда отлавливать ошибки типа android.os.RemoteException которые могут возникать при потере соединения.
Если во время асинхронной операции клиентское приложение будет закрыто, то при вызове callback.onSuccess(sum) на стороне сервера мы получим ошибку android.os.DeadObjectException .
Лечится это банально оберткой в try-catch:
Тоже самое работает и в обратную сторону - если на момент вызова приложение-сервер недоступно, то на стороне клиента получим android.os.DeadObjectException .
Кейс с обновлением приложения
Представим такую ситуацию - пользователь работает в клиентском приложении, проводит какие-то важные операции, и вдруг приложение-сервер начинает процесс обновления - соединение с сервисом обрывается, и следующий вызов метода не приводит к должной реакции. Как итог - пользователи недовольны, а тестировщики заводят баг.
Исправляется очень просто - в момент подключения к сервису регистрируем BroadcastReceiver и слушаем событие ACTION_PACKAGE_REPLACED , а в момент его получения переподключаемся к сервису:
Т.к события от системы могут прийти с задержкой - 100% гарантии мы не получим, но от массовых жалоб нас это точно спасёт.
Кейс по-сложнее №3 - ошибки
Возьмём предыдущий пример с коллбеком и предположим что у нас появилась необходимость передавать ошибки клиенту, например ArithmeticException при делении на ноль, ну или собственные ошибки унаследованные от RuntimeException .
Добавим в коллбек новый метод onError , который будет вызван если на стороне сервера произойдёт ошибка:
Ну вот мы и встретили первую боль - мы не можем передавать ошибки т.к они не реализуют интерфейс Parcelable .
Первое решение которое приходит в голову - создать нечто вроде Parcelable -контейнера для ошибок, т.к всё-таки у нас есть возможность записать Serializable объект в Parcel .
Теперь наш коллбек будет выглядеть примерно так:
Выглядит конечно так себе, да и опять нужно создавать файл-заглушку для ExceptionHolder 'а, но другого способа нет. Однако запустив приложение увидим следующее:
Первая строчка прямо даёт понять что передавать ошибки между процессами не получится, значит нужно искать другой способ.
Немного погуглив натыкаемся на точно такой же вопрос на SO. В качестве решения нам предлагают писать собственные классы-ошибки, а для передачи между процессами использовать errorCode . Скажу сразу - варианта лучше я не нашел, его попросту не существует. Поэтому сэкономьте время и сделайте точно также.
Таким образом, текущая реализация всего этого будет выглядеть примерно так:
Класс, который будет использоваться для передачи ошибки и "воссоздании" её на стороне клиента:
Коллбек, ответственный за передачу результата между процессами:
Отправка ошибки на стороне сервиса:
Получение и конвертация ошибки на стороне клиента:
Кейс по-сложнее №4 - дженерики
В один момент я осознал что слишком ленив, чтобы при создании каждого Parcelable класса создавать для него ещё и файл-заглушку формата .aidl, так что я решил что гораздо удобнее будет создать единый класс для всех транзакций, а нужный мне объект хранить внутри такого контейнера.
Если вы думали что весь ужас закончится на передаче ошибок, вы ошибались - в AIDL нет дженериков. Формально они, конечно, есть - мы можем указать тип списка вроде List<String> , но указать тип у собственных Parcelable классов не получится.
Ладно – подумал я, пускай их не будет - исходники обоих приложений прямо передо мной, и я точно знаю какой тип данных ожидать на "той" стороне, поэтому мне не составит труда просто передать такой объект из одного приложения в другое. Таким образом можно будет избавится от дублирования .aidl файлов для каждого Parcelable класса.
Давайте напишем такой контейнер и опробуем нашу "технику":
Коллбек с результатом теперь присылает AidlResult вместо Sum :
На стороне сервера Sum оборачивается в AidlResult :
А на стороне клиента приводим data из AidlResult к типу Sum :
Как думайте, заработает-ли оно с первого раза? Ответ будет отличаться в зависимости от версии kotlin-parcelize плагина.
Когда я только начинал изучать AIDL, в плагине kotlin-android-extensions был баг с типизацией для дженерик-классов который не позволял использовать их в AIDL, т.е аннотация @Parcelize генерировала неподдерживаемый для AIDL код.
Да и сейчас, хоть студия и позволит нам собрать приложение, если посмотрим на сгенерированный код то нам подсветят ошибки:
Единственным решением которое было мной найдено, это использовать вот такой костыль:
Костыль для дженериков
Т.е по сути мы динамически загружаем класс используя ClassLoader , да ещё и лишаемся возможности сгенерировать шаблонный код через @Parcelize .
Я не знаю кого за это благодарить Google или JetBrains, но с переходом на версии Kotlin 1.4.10 -> 1.4.21 и с плагина kotlin-android-extensions на kotlin-parcelize всё заработало и эти костыли не нужны - респект!
UPD 29/01/21: Извиняюсь, ошибся. Всё ещё актуально:
Заключение
Работа с IPC в андройде не идеальна - очень расстроила плохая поддержка Android Studio, отсутствие типизации в интерфейсах и механизма передачи ошибок, но всё-же это был интересный опыт. Надеюсь что статья помогла вам разобраться с работой в AIDL и сэкономит немного времени на разработку приложения.
Также оставлю ссылку на исходники учебного проекта на GitHub, там будет полная реализация всего того что было проделано в рамках этой статьи. И если я что-то упустил - пишите в комментариях, постараюсь ответить и прояснить эти моменты.
Читайте также: