В этой статье, я покажу, как сделать автозапуск приложения в Андроид используя RAD Studio Seattle.
Последний апдейт от 16.04.17.
Последний апдейт от 16.04.17.
Начнём с плана:
- Нам необходим java-класс, наследник от BroadcastReceiver, который, собственно и будет запускать наше приложение
- Файл classes.dex, склеенный с нашим java-классом
- Ну и само приложение, которые мы хотим запускать после перезагрузки системы
Пункт 1. Java – класс.
Ничего особо сложного в нём нет. Класс можно написать в Android Studio, в любом блокноте (например: Notepad ++) или вообще просто скопировав код ниже и вставив его опять же через блокнот, этот вопрос уже сами решайте :)
Я опишу пример, где класс создаём через Notepad ++.
Для начала создадим структуру папок:
- В папке «ReceiverProject» будем хранить наш проект.
- В папке «ReceiverProject\java\src\com\TestReceiver\» будет наш класс, назовём его «BootCompletedReceiver», т.е. там будет лежать файл «BootCompletedReceiver.java».
Теперь пишем код:
Описание кода.
Определяем имя пакета (оно совпадает с частью пути, по которому хранится файл), подключаем модули.
Наследуемся от BroadcastReceiver, определяем метод onReceive, в нём проверяем, если пришло сообщение о завершении загрузки системы, то создаём Интент, прописываем имя класса приложения (в FMX – это всегда «com.embarcadero.firemonkey.FMXNativeActivity»), устанавливаем флаг на запуск Активити в новом таске, ну и стартуем активити (метод startActivity), передав Интент.
Как-то так… :)
package com.TestReceiver; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; public class BootCompletedReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) { Intent TestLauncher = new Intent(); TestLauncher.setClassName(context, "com.embarcadero.firemonkey.FMXNativeActivity"); TestLauncher.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(TestLauncher); } } }
Описание кода.
Определяем имя пакета (оно совпадает с частью пути, по которому хранится файл), подключаем модули.
Наследуемся от BroadcastReceiver, определяем метод onReceive, в нём проверяем, если пришло сообщение о завершении загрузки системы, то создаём Интент, прописываем имя класса приложения (в FMX – это всегда «com.embarcadero.firemonkey.FMXNativeActivity»), устанавливаем флаг на запуск Активити в новом таске, ну и стартуем активити (метод startActivity), передав Интент.
Как-то так… :)
Важно, также, заметить, что для «ACTION_BOOT_COMPLETED» требуется выдать разрешение «RECEIVE_BOOT_COMPLETED» в манифесте приложения, но об этом позже.
Ну вот, класс у нас готов.
Ну вот, класс у нас готов.
Пункт 2. Файл classes.dex.
Я уже писал о том, как создавать этот файл в статье «Как подключить и использовать свой JAVA-класс».
Поэтому здесь, вкратце опишу действия, нам необходим bat-файл, в котором мы пропишем пути, положим его в папку «ReceiverProject\java\» и запустим. На выходе, у нас появится папка «ReceiverProject\java\output\dex\», которая содержит файл classes.dex.
Поэтому здесь, вкратце опишу действия, нам необходим bat-файл, в котором мы пропишем пути, положим его в папку «ReceiverProject\java\» и запустим. На выходе, у нас появится папка «ReceiverProject\java\output\dex\», которая содержит файл classes.dex.
Готовый bat файл (вам останется прописать пути, при необходимости) можно взять из исходников, которые я выложил ниже.
Update 23.02.17. Действительно для XE7 и выше. BAT - файл для JAVA 1.7 - 1.8
Для тех, кто уже понимает или наоборот не хочет понимать, для чего нужен classes.dex.
Вы можете создать JAR файл с вашим JAVA классом и добавить его через Project Manager (Как добавить jar библиотеку в проект, в данном случае, обёртку делать не нужно).
Для создания JAR файла, вам необходимо использовать bat файл с таким содержимым:
@echo off setlocal if x%ANDROID% == x set ANDROID=C:\Android\sdk set ANDROID_PLATFORM=%ANDROID%\platforms\android-24 set PROJ_DIR=%CD% set VERBOSE=0 echo. echo Compiling the Java service activity source files echo. mkdir output 2> nul mkdir output\classes 2> nul if x%VERBOSE% == x1 SET VERBOSE_FLAG=-verbose javac -source 1.7 -target 1.7 %VERBOSE_FLAG% -Xlint:deprecation -cp %ANDROID_PLATFORM%\android.jar -d output\classes src\com\TestReceiver\BootCompletedReceiver.java echo. echo Creating jar containing the new classes echo. mkdir output\jar 2> nul if x%VERBOSE% == x1 SET VERBOSE_FLAG=v jar c%VERBOSE_FLAG%f output\jar\test_classes.jar -C output\classes com echo. echo Now we have the end result, which is output\jar\test_classes.jar :Exit pause endlocal
После выполнения этого bat файла, у вас появится файл output\jar\test_classes.jar. Его то и добавьте через Project Manager (подробности в статье, указанной чуть выше).
Update 16.04.17.
- Если вы выбрали вариант с добавлением jar файл, то вам не нужно создавать classes.dex, просто добавляете jar файл в проект и всё.
- Если вы выбрали вариант с файлом classes.dex, то не нужно добавлять jar файл одновременно с ним.
- В обоих случаях для данного примера обёртка не нужна!
Пункт 3. Приложение.
Ну, тут всё совсем просто, можно создать пустой проект.
- В «Uses Prmissions» выдаём разрешение «Receive boot complited».
- В Deployment Manager снимаем галочку с файла (по умолчанию) «classes.dex», добавляем туда наш файл из папки «ReceiverProject\java\output\dex», прописываем у него путь (Remote Path) «classes\».
- В Project Manager жмём Build, это необходимо, чтобы среда создала файл «AndroidManifest.template.xml» в корне проекта.
Открываем файл «AndroidManifest.template.xml», находим строчку «<%receivers%>» и после неё пишем
<receiver android:name="com.TestReceiver.BootCompletedReceiver" android:permission="android.permission.RECEIVE_BOOT_COMPLETED" android:enabled="true"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </receiver>
В первой строчке мы указываем имя нашего ресейвера, «com.TestReceiver» - имя пакета, «BootCompletedReceiver» - название нашего класса.
Важные замечания.
Важные замечания.
- Проверяйте Deployment Manager, среда иногда ставит обратно галочку на стандартном classes.dex.
- Чтобы приложение подписалось на события системы, его необходимо один раз запустить.
Сохраняем файл и запускаем компиляцию проекта.
На этом всё.
Как всегда, более подробно, читайте официальную справку :)
Видео
Исходники: Скачать с Google Drive