- Автозапуск приложения при загрузке
- Практика: ошибки и особенности эксплуатации
- Отладка ресивера в эмуляторе и на реальных устройствах
- Итоги
- Android java запуск программ при
- Android. Автозапуск приложения при загрузке: теория и практика
- 1. Теория
- 2. Практика: ошибки и особенности эксплуатации
- 3. Отладка ресивера в эмуляторе и на реальных устройствах.
- Итоги
Автозапуск приложения при загрузке
Тема получения сообщения ACTION_BOOT_COMPLETED остается актуальной и по сей день. Многие новички сталкиваются с проблемой: они не получают в своих приложениях данное сообщение.
Можно выделить следующие правила:
В манифесте указать разрешение:
В манифесте в блоке application зарегистрировать приёмник на приём сообщения ACTION_BOOT_COMPLETED:
В описании без необходимости не указывайте атрибуты «enabled», «exported» и т.д. Вполне достаточно настроек и атрибутов по умолчанию.
Код вашего широковещательного приёмника:
public class BootCompletedReceiver extends BroadcastReceiver < public BootCompletedReceiver() < >public void onReceive(Context context, Intent intent) < if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) < // ваш код здесь >> >
Если ваш приёмник используется только для сообщения ACTION_BOOT_COMPLETED, то проверка «if» не обязательна. Однако иногда разработчики используют один и тот же ресивер для разных сообщений. В этом случае фильтруйте сообщения, проверяя их внутри метода onReceive().
Приложение должно быть установлено на внутреннюю память. Android устроена таким образом, что сообщение ACTION_BOOT_COMPLETED отправляется приложениям перед монтированием внешний памяти. Поэтому приложения, установленные на внешней памяти, никогда не получат это сообщение. Чтобы указать системе не устанавливать приложение на внешнюю память, в манифесте НЕ нужно прописывать для атрибута «@android:installLocation» значения «auto» или «preferExternal». По умолчанию, т.е. если этот атрибут не указан, Android установит ваше приложение только на внутреннюю память. Однако согласно официальной документации лучше явно указать значение «internalOnly», чтобы у вас и других разработчиков не возникло искушение в будущем указать иное значение.
После установки или принудительной остановки (force stop) приложение должно быть запущено хотя бы один раз, чтобы система «запомнила» это приложение для отправки ему сообщения ACTION_BOOT_COMPLETED. Такое поведение было реализовано в версии Android 3.1 в целях безопасности. В чем суть? Все только что установленные приложения находятся в состоянии «stopped» (не путать с активити, т.к. система управляет этим состоянием у приложений и активностей по-разному). В это же состояние приложение «уходит», когда пользователь в настройках телефона принудительно его останавливает. Пока приложение находится в таком состоянии, оно не будет запущено системой ни по какой причине (например, через ACTION_BOOT_COMPLETED), исключая, конечно же, запуск самим пользователем. Благодаря такому нововведению немалая часть вирусов и троянцев» перестала работать, т.к. уже нет возможности запуститься автоматом после установки.
Исключение составляют системные приложения.
Особенности режима Fast boot в HTC-устройствах: Известно, что HTC-устройства не перезагружаются в классическом смысле, а используют так называемый режим Fast boot (это одна из форм гибернации), сохраняя состояние ОС на диск. Поэтому сообщение ACTION_BOOT_COMPLETED не отправляется системой, т.к. в действительности перезагрузка не происходит. Вместо ACTION_BOOT_COMPLETED система может отправить следующие сообщения:
В вашем приложении укажите в теге «receiver» кроме ACTION_BOOT_COMPLETED также вышеуказанные сообщения. Кроме этого необходимо прописать дополнительное разрешение:
Практика: ошибки и особенности эксплуатации
Разберём ошибки, которые совершают новички при настройке приложения и в коде.
- После установки или force stop приложение ни разу не запускалось.
- Приложение установлено не на внутренней памяти, или пользователь вручную перенес его на внешнюю память.
- У некоторых разработчиков приём начинал работать, когда они указывали относительное имя класса приёмника.
- Также некоторые разработчики в Logcat не видели своих сообщений из ресивера. Используйте Toast для отладки:
Toast toast = Toast.makeText(context.getApplicationContext(), context.getResources().getString(R.string.your_message), Toast.LENGTH_LONG); toast.show();
Отладка ресивера в эмуляторе и на реальных устройствах
Далее, чтобы отправить ACTION_BOOT_COMPLETED всем приложениям, наберите в терминале:
am broadcast -a android.intent.action.BOOT_COMPLETED
Или для отправки ACTION_BOOT_COMPLETED конкретному приложению наберите в терминале:
am broadcast -a android.intent.action.BOOT_COMPLETED your.package.name
В эмуляторе: установите ваше ПО, запустив его из студии. При этом студия соберет ваш проект, установит приложение и запустит его. После этого закройте эмулятор (это аналогично выключению на реальном устройстве). Чтобы получить сообщение ACTION_BOOT_COMPLETED, запустите эмулятор из AVD-менеджера, а не с помощью кнопки «Run app» в студии.
После запуска эмулятора во вкладке Android Monitor укажите запущенный эмулятор и ваше приложение, чтобы просмотреть логи logcat.
Итоги
Чтобы ваше приложение запускалось при загрузке на всех устройствах, манифест как минимум должен выглядеть так:
Код ресивера, как правило, будет таким:
public class BootCompletedReceiver extends BroadcastReceiver < public BootCompletedReceiver() < >public void onReceive(Context context, Intent intent) < if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) < Toast toast = Toast.makeText(context.getApplicationContext(), context.getResources().getString(R.string.your_message), Toast.LENGTH_LONG); toast.show(); Log.d("myapp", context.getResources().getString(R.string.your_message); // ваш код здесь >> >
Android java запуск программ при
В этом уроке мы научимся запускать свое приложение вместе с загрузкой системы. То есть, когда вы перезапустите устройство, то наше приложение автоматически запуститься. Это может пригодиться в том случае, если вы создали что то типа антивируса, лаунчера или еще что то такое, что должно запускаться при запуске системы Android на устройстве.
Реализация этой возможности довольно проста. В своем приложении мы должны прослушивать действие BOOT_COMPLETED и настраивать реакцию приложения в случае выполнения этого действия. Прослушивать это действие можно, используя BroadcastReceiver, который и будет запускать activity нашего приложения после того, как получит сигнал о свершении действия BOOT_COMPLETED.
Создадим простое приложение, состоящее из всего одного текстового объекта TextView и будем запускать его при загрузке Android системы на устройстве.
Создаем новый проект, открываем файл activity_main.xml и добавляем туда элемент TextView:
xml version="1.0" encoding="utf-8"?> LinearLayout xmlns:android="schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Приложение запущено" android:padding="10pt" android:textSize="12pt" android:layout_gravity="center"/> /LinearLayout>
Файл MainActivity.java в этот раз выглядит предельно просто:
import android.app.Activity; import android.os.Bundle; public class MainActivity extends Activity< @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); > >
Теперь беремся за создание того самого класса BroadcastReceiver. Он также будет предельно прост и состоит по сути всего из одного действия — запуска основной activity приложения с помощью намерения Intent. Создаем новый класс под названием AutoStart.java, который расширяется от BroadcastReceiver и добавляем в него следующее:
import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; public class AutoStart extends BroadcastReceiver< @Override public void onReceive(Context context, Intent intent) < Intent intent1 = new Intent(context, MainActivity.class); intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent1); > >
Все что осталось сделать, это объявить о созданном классе в файле AndroidManifest.xml. Объявляем наш приемник события загрузки системы BOOT_COMPLETED, который будет получен программой с помощью intent, а также настраиваем разрешение на прослушивание действия загрузки системы RECEIVE_BOOT_COMPLETED:
receiver android:name=".AutoStart" android:enabled="true" android:permission="android.permission.RECEIVE_BOOT_COMPLETED" > intent-filter> action android:name="android.intent.action.BOOT_COMPLETED" /> category android:name="android.intent.category.DEFAULT" /> /intent-filter> /receiver>
Вот и все, чтобы протестировать наше чудо Android приложение, нужно установить его на устройство и перезапустить аппарат — при запуске вы увидите, что вместе с системой запустилось и наше приложение!
Android. Автозапуск приложения при загрузке: теория и практика
Простой поиск на stackoverflow.com показывает, что тема получения сообщения ACTION_BOOT_COMPLETED остается актуальной и по сей день. Как видно, многие новички сталкиваются с проблемой: они не получают в своих приложениях сообщение ACTION_BOOT_COMPLETED. В этой статья я попробую резюмировать данные из официальной документации, опыт многих разработчиков из stackoverflow.com, а также свой опыт. Итак, как же победить этого «коварного врага» под названием «ACTION_BOOT_COMPLETED»?
1. Теория
Взглянув на примеры из официального источника (например, этот и этот) и изучив рекомендации на сайте stackoverflow.com, можно выделить следующие правила:
- В манифесте в элементе «manifest» указать разрешение:
Используйте правильное полное или относительное имя класса вашего broadcast-ресивера. В описании ресивера без необходимости не указывайте атрибуты «enabled», «exported» и т.д. Вполне достаточно настроек и атрибутов по умолчанию.
public class BootCompletedReceiver extends BroadcastReceiver < public BootCompletedReceiver() < >public void onReceive(Context context, Intent intent) < if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) < // ваш код здесь >> >
Если ваш ресивер используется только для сообщения ACTION_BOOT_COMPLETED, то проверка «if» не обязательна. Однако иногда разработчики используют один и тот же ресивер для разных сообщений. В этом случае фильтруйте сообщения, проверяя их внутри метода onReceive.
Исключение составляют системные приложения: см. замечание пользователя kolipass.
В вашем приложении укажите в теге «receiver» кроме ACTION_BOOT_COMPLETED также вышеуказанные сообщения. Кроме этого необходимо прописать разрешение в дополнение к п.1:
2. Практика: ошибки и особенности эксплуатации
Разберем ошибки, которые совершают новички при настройке приложения и в коде.
- После установки или force stop приложение ни разу не запускалось (см. п.1.5).
Toast toast = Toast.makeText(context.getApplicationContext(), context.getResources().getString(R.string.your_message), Toast.LENGTH_LONG); toast.show()
- «uses-permission» должен быть указан только как прямой потомок элемента «manifest», не нужно его указывать/дублировать в теге «receiver»;
- тег «receiver» должен быть указан только как прямой потомок элемента «application».
3. Отладка ресивера в эмуляторе и на реальных устройствах.
Далее, чтобы отправить ACTION_BOOT_COMPLETED всем приложениям, наберите в терминале:
am broadcast -a android.intent.action.BOOT_COMPLETED
Или для отправки ACTION_BOOT_COMPLETED конкретному приложению наберите в терминале:
am broadcast -a android.intent.action.BOOT_COMPLETED my.package.name
После запуска эмулятора во вкладке Android Monitor укажите запущенный эмулятор и ваше приложение, чтобы просмотреть логи logcat.
Итоги
Чтобы ваше приложение запускалось при загрузке на всех устройствах, манифест как минимум должен выглядеть так:
Код ресивера, как правило, будет таким:
public class BootCompletedReceiver extends BroadcastReceiver < public BootCompletedReceiver() < >public void onReceive(Context context, Intent intent) < if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) < Toast toast = Toast.makeText(context.getApplicationContext(), context.getResources().getString(R.string.your_message), Toast.LENGTH_LONG); toast.show(); Log.d("myapp", context.getResources().getString(R.string.your_message); // ваш код здесь >> >
Надеюсь, эта статья поможет новичкам побороть «коварного врага» под названием «ACTION_BOOT_COMPLETED».