- Android для начинающих: Понимание Android-бродкастов
- 1. Создание трансляции
- 2. Получение трансляций
- 3. Передача системных трансляций
- 4. Работа с локальными трансляциями
- 5. Использование EventBus
- Заключение
- # How to create a live broadcasting app in Java using Android Studio
- # Supported instruction set architectures
- # Create a new Application
- # Add the broadcast SDK
- # Configure Gradle to build for supported architectures
- # Add required Android app permissions and features
- # Add the viewfinder
- # Authentication
- # Bootstrap the SDK
- # Screen rotation and keep-awake
- # Add a broadcast button
- # Log events from the app
- # Running the app
- # What’s next
Android для начинающих: Понимание Android-бродкастов
Большинство из нас слишком хорошо знакомы с объявлениями в общественных местах. Это громкие сообщения, которые предназначены для информирования больших групп людей о чем-то важном. Приложениям Android также приходится иметь дело с объявлениями иногда это объявления, создаваемые либо другими приложениями, либо самой операционной системой Android. Такие объявления называются трансляциями, и они рассматриваются как важная форма асинхронной межпроцессной коммуникации на платформе Android.
В этом уроке я покажу вам, как создавать, отправлять и получать как локальные, так и общесистемные трансляции. Я также покажу вам, как использовать стороннюю библиотеку EventBus, которая может служить альтернативой локальным трансляциям.
1. Создание трансляции
Android-трансляции отправляются в виде объектов Intent . Поэтому перед созданием трансляции вы должны создать объект Intent . В этой серии есть подробный учебник о намерениях. Если вы еще не прочитали его, сейчас самое подходящее для этого время.
Каждое намерение, которое вы отправляете в виде трансляции, должно иметь название действия. Хотя имя действия может быть любой строкой, я рекомендую вам всегда указывать имя пакета вашего приложения, чтобы избежать конфликтов с трансляциями от других приложений.
Следующий фрагмент кода показывает, как создать новое намерение с именем действия com.tutsplus.my.first.broadcast:
Чтобы отправить намерение в эфир, все, что вам нужно сделать, это вызвать метод sendBroadcast() и передать объект Intent в качестве аргумента.
Обратите внимание, что метод sendBroadcast() создает глобальную трансляцию, которая может быть получена не только вашим приложением, но и любым другим приложением, установленным на устройстве пользователя.
2. Получение трансляций
Чтобы иметь возможность принимать трансляцию, ваше приложение должно иметь надлежащим образом настроенный приемник трансляций. Вы можете создать такой приемник, расширив абстрактный класс BroadcastReceiver и переопределив его метод onReceive() . Например, вот как вы создаете приемник, который печатает сообщение каждый раз, когда он получает трансляцию:
Приемник работает только в том случае, если он зарегистрирован. Самый простой способ сделать это — объявить его в файле манифеста проекта с помощью тега receiver .
Кроме того, внутри объявления приемника вы должны включать теги intent-filter , в которых указываются имена действий, в которых заинтересован широковещательный приемник.
Следующий фрагмент кода регистрирует MyBroadcastReceiver и настраивает его для ответа на действие com.tutsplus.my.first.broadcast:
3. Передача системных трансляций
Операционная система Android выпускает несколько глобальных трансляций. Большинство из них содержат ценную информацию об изменениях в состоянии Android-устройства. Например, каждый раз, когда пользователь помещает новый исходящий вызов, выдается трансляция android.intent.action.NEW_OUTGOING_CALL . Аналогично, каждый раз, когда пользователь включает или выключает режим полета, выдается трансляция android.intent.action.AIRPLANE_MODE .
Получение системной трансляции — это как получение обычных трансляций. Однако большинство системных трансляций содержат дополнительную информацию в виде дополнительных функций. Вы можете получить все эти дополнительные функции как объект Bundle, вызвав метод getExtras (). Например, намерение трансляция android.intent.action.AIRPLANE_MODE всегда содержит дополнение state , которое является логическим значением, которое определяет, включен или выключен режим полета.
В следующем фрагменте кода показано, как регистрировать значение дополнительное значение state :
Обратите внимание, что приведенный выше код будет работать только в том случае, если вещательный приемник зарегистрирован с помощью следующего фильтра намерений:
4. Работа с локальными трансляциями
По очевидным причинам глобальные трансляции никогда не должны содержать конфиденциальную информацию. Тем не менее, вы можете передавать такую информацию локально, используя класс LocalBroadcastManager , который входит в состав Android Support Library.
Если вы используете последнюю версию Android Studio, вам не придется вручную добавлять зависимость для библиотеки поддержки Android. Однако, если вы хотите реализовать локальные трансляции в старом проекте, убедитесь, что следующая строка присутствует в файле build.gradle модуля app:
Чтобы создать новый экземпляр класса LocalBroadcastManager , вы должны вызвать его метод getInstance() и передать свою деятельность или сервис в качестве контекста. Например, вот как создать экземпляр внутри действия под названием MyActivity :
Теперь вы можете отправлять локальные трансляции, используя метод sendBroadcast() класса LocalBroadcastManager . Следующий фрагмент кода создает новое намерение, название действия которого — my-local-broadcast , и отправляет его в качестве локальной трансляции:
Получение местной трансляции выглядит несколько сложнее. Локальный приемник не должен быть зарегистрирован в файле манифеста проекта. Вместо этого он должен регистрироваться динамически с использованием метода registerReceiver() класса LocalBroadcastManager . В дополнение к экземпляру приемника для метода registerReceiver() требуется объект IntentFilter , определяющий имя действия, на которое должен реагировать приемник.
Вот как вы могли бы создать и зарегистрировать приемник, который может реагировать на действие my-local-broadcast :
Динамически зарегистрированные получатели должны быть отсоединены, когда они больше не нужны. Для этого вы должны использовать метод unregisterReceiver() класса LocalBroadcastManager .
5. Использование EventBus
Если вы считаете, что местные трансляции и намерения не дают вам всю необходимую гибкость, вам следует рассмотреть возможность использования EventBus — сторонней библиотеки, которая позволяет асинхронно отправлять данные из одного компонента вашего приложения в другой. На мой взгляд, API EventBus очень интуитивно понятен и краток.
Чтобы включить EventBus в свой проект, добавьте следующую compile зависимость в файл build.gradle вашего модуля app:
Вместо объектов Intent EventBus позволяет отправлять и получать объекты любого класса Java. Например, экземпляры следующего класса могут быть легко использованы с EventBus:
EventBus реализует шаблон publisher-subscriber и создает центральную шину, доступную для всех компонентов вашего приложения. Поэтому компонент, который должен отправлять объекты, должен просто публиковать объекты на шине. Компонент, который заинтересован в получении этих объектов, должен зарегистрироваться как абонент шины.
Самый быстрый способ получить экземпляр центральной шины — использовать метод getDefault() класса EventBus .
Чтобы опубликовать объект, все, что вам нужно сделать, это вызвать метод post() для шины. Например, вот как вы могли бы опубликовать экземпляр класса MyMessage :
Компонент приложения, такой как активность или услуга, может регистрироваться как абонент, вызывая метод register() шины. Следующий пример кода регистрирует услугу MyService :
Компонент, который действует как подписчик, должен также иметь метод подписки, который является любым методом, который имеет аннотацию @Subscribe . Методы подписчиков ведут себя подобно обработчикам событий и автоматически вызываются каждый раз, когда на шине доступны новые объекты.
В следующем фрагменте кода показано, как создать очень простой метод подписки, который автоматически вызывается каждый раз, когда на шине доступен новый экземпляр класса MyMessage :
Заключение
В этом уроке вы узнали, как отправлять информацию с одного прикладного компонента на другой, используя глобальные и локальные трансляции. Вы также узнали, как использовать очень популярную библиотеку EventBus для общения внутри приложения. Поскольку трансляции имеют очень низкие накладные расходы, вы можете отправлять максимально часто. Фактически, система Android генерирует новую трансляцию android.intent.action.TIME_TICK каждую минуту.
Чтобы узнать больше о приемниках и трансляциях Android, вы можете обратиться к документации классов BroadcastReceiver и Intent.
Источник
# How to create a live broadcasting app in Java using Android Studio
This guide is based on Android Studio 3.5.3.
This guide focuses on the bare minimum required to start broadcasting. We’re using Android Studio, which you can find on developer.android.com/studio
(opens new window) . Make sure to familiarize yourself with the example apps in the SDK bundles for a more complete overview.
If you want to clone a sample project similar to this guide, see the Broadcaster example for Android
(opens new window) project on our GitHub page.
# Supported instruction set architectures
The Bambuser SDK contains native code built for the armeabi-v7a , arm64-v8a , x86 and x86_64 ABIs
# Create a new Application
- Open Android Studio
- Choose Start a new Android Studio project
- Select the Phone and Tablet form factor.
- Choose the Empty Activity template.
- Enter a suitable application name and your company domain.
- Set the Minimum SDK to at least API 21: Android 5.0, which is the oldest API supported by the Broadcaster
(opens new window) .
# Add the broadcast SDK
- Log in to the Bambuser site and download the latest SDK bundle for Android from the Developer
(opens new window) page.
- Click the + in the upper left corner of the list of modules.
- Choose Import .JAR/.AAR Package.
- Navigate to the SDK files you extracted and import the .aar file.
You may now need to close and reopen the Project Structure screen, for the library module to show up in the list. Some recent versions of Android Studio fail to add new modules to the settings.gradle file. If this happens, add include ‘:libbambuser’ manually at the end of the file and sync the project, then reopen the Project Structure screen.
- Switch to the Dependencies tab and keep the app module selected.
- Click the + in the dependency pane and choose Module dependency.
- Choose the imported library module, click OK
- Click OK to return from the Project Structure screen.
# Configure Gradle to build for supported architectures
The Bambuser SDK contains native code built for the armeabi-v7a , arm64-v8a , x86 and x86_64 ABIs
(opens new window) . If you don’t want to bundle all of them, or if other libraries contain native code for other architectures, an ABI filter is needed to ensure that the generated APK contains the greatest common denominator.
The armeabi-v7a and arm64-v8a ABIs
(opens new window) are compatible with all modern devices and ARM emulator images. The x86 and x86_64 ABIs are in practice only necessary when developing on x86 emulator images, as real x86 devices can translate ARM machine code.
Open the build.gradle file for the app module.
Add an NDK ABI filter to the android defaultConfig block. For example:
# Add required Android app permissions and features
The Bambuser broadcasting library for Android requires at least the following permissions for basic functionality: CAMERA
(opens new window) permissions at this point.
Additionally, to achieve suitable filtering
(opens new window) of your app in the Google Play store, you should declare tags relevant for apps that rely on the camera.
Open the manifests/AndroidManifest.xml file in the Project tree on the left.
Add the following tags for permissions and features, before the tag:
Since Android 6.0, the above is not enough. Certain permissions must be approved
(opens new window) by the end-user at runtime. In the generated MainActivity.java , check for and request any missing permissions:
This is enough for our minimal example. In practice, you should also at least implement onRequestPermissionsResult() in case the user rejects any of the requested permissions.
# Add the viewfinder
In activity_main.xml replace the auto-generated TextView with a SurfaceViewWithAutoAR
By switching from the Design tab to the Text tab near the bottom, you can access the XML representation and paste the snippet above.
- In the generated MainActivity.java import and add a reference to the SurfaceView
# Authentication
To be able to broadcast, your app needs to identify itself to Bambuser. Head over to the Developer
(opens new window) page on the Bambuser site again and get the Sandbox applicationId, which we’ll use when constructing the Broadcaster
Remember to replace the Sandbox id with a Production applicationId before you release your app!
# Bootstrap the SDK
Prepare MainActivity.java for integration of the Broadcaster
(opens new window) by importing the related classes and adding an implementation of the Broadcaster.Observer
Add the applicationId, and in the onCreate(Bundle) method create an instance of the Broadcaster
(opens new window) class. Override and forward the Activity
(opens new window) lifecycle events necessary for init and release of the camera.
# Screen rotation and keep-awake
To rotate the camera preview and live video according to the rotation of the device, forward the display rotation to the Broadcaster
To prevent the screen from going to sleep, set FLAG_KEEP_SCREEN_ON
(opens new window) when a broadcast starts and clear it when the broadcast ends.
(opens new window) class where the flag is found:
Then add an implementation to the empty onConnectionStatusChange(BroadcastStatus broadcastStatus) callback in the Broadcaster.Observer
# Add a broadcast button
(opens new window) in the activity_main.xml layout:
Import relevant classes for a Button
(opens new window) and make it respond to clicks in MainActivity.java :
Update the button label depending on broadcast state:
# Log events from the app
Get primitive status updates from the app by logging some of the events in the Broadcaster.Observer
# Running the app
Connect your mobile device to your PC and follow the Android Developers guide for running your app
If everything is set up correctly, you should be able to start your first broadcast from your app by tapping the button we added earlier.
When broadcasting successfully with a valid applicationId, a filtered device log in Android Studio would contain the following output from the example code above:
(opens new window) when logged in on the Bambuser site to view the broadcast when you go live in Sandbox mode.
# What’s next
Be sure to experience a few of your live broadcasts via the Sandbox player on the Bambuser website.
Consider whether you also need a player in your app and / or on your website.
(opens new window) and Webhooks, which can be used to make your backend broadcast-aware.
Источник