Я знаю, что этот вопрос уже задавали много на сайте, но я не могу показаться, чтобы найти решение. Мой BOOT_COMPLETED приемник не вызывается, когда приложение не запущено.
Манифест:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.startuptest"
android:versionCode="1"
android:versionName="1.0"
android:installLocation="internalOnly">
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.startuptest.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name="com.example.startuptest.StartUpBootReceiver" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
</application>
</manifest>
StartUpBootReceiver:
public class StartUpBootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("startuptest", "StartUpBootReceiver " + intent.getAction());
if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {
Log.d("startuptest", "StartUpBootReceiver BOOT_COMPLETED");
}
}
}
Если приложение запущено и я имитировать звонок с
adb shell
am broadcast -a android.intent.action.BOOT_COMPLETED
События, однако, поступает правильно, если приложение закрыто на мероприятие не получил, не получил при запуске.
Я установил приложение, потом запустил его пару раз, чтобы убедиться, что оно зарегистрировано. Я'м достаточно потерял на этом, так что любые советы будут высоко оценены.
Редактировать: я вижу в логах, что все остальные закрытые приложения (Ютуб, FileObserver и т. д.) Для получения события boot_completed, просто не мое.
Начиная с Андроид 3.1 все приложения, после установки, размещены в А "остановился" у государства.(Это состояние, в котором приложение заканчивается после того, как пользователь принудительно-останавливает приложения сразу настройках приложения.)
В то время как в "остановился" в государстве, приложение не будет работать по какой-либо причине, за исключением ручного запуска той или иной деятельности. (Имеется в виду не BroadcastReceviers
(ACTION_PACKAGE_INSTALLED
, BOOT_COMPLETED
и т. д.) будет вызван, вне зависимости от события, на которое они зарегистрировали, до тех пор, пока пользователь запускает приложение вручную.)
Это анти-вредоносных программ шага Google. Компания Google выступает за то, что пользователи должны начать с запуска первого, до этого приложение готово сделать многое. Предотвращение BOOT_COMPLETED
, не доходя до начала мероприятие является логическим следствием этого аргумента.
Более подробно об этом: http://developer.android.com/about/versions/android-3.1.html#launchcontrols http://commonsware.com/blog/2011/07/05/boot-completed-regression.html http://devmaze.wordpress.com/2011/12/05/activating-applications/
Я запустить мое приложение, когда BOOT_COMPLETED, так что я знаю, это's работает. Я добавить журнал.д
он выиграл'т показать. Я добавить тост
это шоу. Небольшой дифферент в Manifest.xml
<receiver android:name="com.example.startuptest.StartUpBootReceiver" android:enabled="true" android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
Каждый ответ здесь добавить небольшой кусочек информации, так вот резюме всего этого:
Чтобы убедиться, что вы получите BOOT_COMPLETED убедитесь, что вы выполните следующие действия:
<приемник для Андроид:имя="У ком.yourpacakge.BootReceiver и" для Android:экспортированы=то"Правда и" Андроид:=на" включено;правда" и> <интент-фильтра> <действие андроид:имя="на Андроид.намерениях.действий.BOOT_COMPLETED и"/> <категория андроид:имя="на Андроид.намерениях.категории.По умолчанию и"/> </intent-фильтр> </приемник> 2. Добавить разрешения:
в <использует-разрешение Android:имя="на Андроид.разрешение.Пожалуйста, напишите, что"/>
боролся с такой же проблемой, причина вы используете журнала.д отслеживать приложения в logcat, к сожалению при перезагрузке телефона приложение получает BOOT_Complete но вы можете't видеть его, потому что он's не войдя в logcat.
попробуйте сделать тосты
с текстом вместо журнала.D`, чтобы убедиться, что если BOOT_COMPLETED или не получил.
надеюсь, что это поможет.
Вот с# версию, если вы хотите его. Мои тесты показывают, что она работает практически безупречно, а запуск происходит достаточно быстро. Хотя следует отметить, что добавление его в С# и в AndroidManifest.xml разбивает его(для меня по крайней мере).
Я также добавил некоторые интересные и полезные примеры, которые я пожалел, что узнал от кого-то, вместо того, чтобы учиться он сам, когда читал документальные и подобные.
[BroadcastReceiver(Enabled = true, Exported = true, DirectBootAware = true, Name = "com.nevaran.startup.StartUpBootReceiver")]
[IntentFilter(new string[] {
Intent.ActionBootCompleted
, Intent.ActionLockedBootCompleted
, Intent.ActionMyPackageReplaced
, Intent.ActionUserInitialize
, "android.intent.action.QUICKBOOT_POWERON"
, "com.htc.intent.action.QUICKBOOT_POWERON"
})]
public class BootReceiver : BroadcastReceiver
{
public override void OnReceive(Context context, Intent intent)
{
if( intent.Action.Equals(Intent.ActionBootCompleted)
|| intent.Action.Equals(Intent.ActionLockedBootCompleted)
|| intent.Action.Equals(Intent.ActionUserInitialize)
|| intent.Action.Equals("android.intent.action.QUICKBOOT_POWERON")
|| intent.Action.Equals("com.htc.intent.action.QUICKBOOT_POWERON")
)
{
//run code here only if its started by the chosen actions
}
//some code that doesnt care about which action is triggered by
}
}
Чтобы устранить эту проблему, можно использовать firebaseJobDispatcher для автоматического вызова , firebaseJobDispatcher будет содержать код для реактивной ваши услуги, Да после определенного времени сервисы могут остановить ОС, но ваш firebaseJobDispatcher будет заново активировать ваши услуги. FirebaseJobDispatcher имеет множество свойств, из которого можно определить масштабы этого;
как это работает, более подробно https://github.com/firebase/firebase-jobdispatcher-android
если вы хотите знать причину, почему BOOT_COMPLETE не работает или не получает. Я предлагаю вам перейти на официальный Android разработка сайта. Они объяснили с точным решением.
В основном, требуется Android:=на" включено;правда и" для Android:экспортированы=на"истинный" и флаги в манифесте для получения эфира.
<receiver android:name=".bootReceiver" android:enabled="true" android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</receiver>