Важно (9.07.22)

Если картинки в постах не отображаются, зайдите в блог через прокси. РКН заблокировал поддомены blogger.com на которые загружались картинки.

среда, 27 января 2016 г.

[BroadcastReceiver] Автозапуск приложения после перезагрузки ОС

В этой статье, я покажу, как сделать автозапуск приложения в Андроид используя RAD Studio Seattle.
Последний апдейт от 16.04.17.

Начнём с плана:
  1. Нам необходим java-класс, наследник от BroadcastReceiver, который, собственно и будет запускать наше приложение
  2. Файл classes.dex, склеенный с нашим java-классом
  3. Ну и само приложение, которые мы хотим запускать после перезагрузки системы

Пункт 1. Java – класс.
Ничего особо сложного в нём нет. Класс можно написать в Android Studio, в любом блокноте (например: Notepad ++) или вообще просто скопировав код ниже и вставив его опять же через блокнот, этот вопрос уже сами решайте :)
Я опишу пример, где класс создаём через Notepad ++.
Для начала создадим структуру папок:
  • В папке «ReceiverProject» будем хранить наш проект.
  • В папке «ReceiverProject\java\src\com\TestReceiver\» будет наш класс, назовём его «BootCompletedReceiver», т.е. там будет лежать файл «BootCompletedReceiver.java».

Теперь пишем код:
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 файл (вам останется прописать пути, при необходимости) можно взять из исходников, которые я выложил ниже.

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