BOOT_COMPLETED не работает Android
Прежде всего, я знаю, что были заданы сотни таких вопросов, но я проверял их все некоторое время и все еще не мог найти никакого решения.
Я видел этот ответ, в котором говорилось, что BOOT_COMPLETED не отправляется в приложение, если пользователь не запустит ваше приложение первым после Android версии 3.1. Но я все еще вижу, что некоторые приложения делают это, должен быть способ. Мне действительно нужно с этим справиться, иначе я тоже против того, чтобы что-то делать без взаимодействия с пользователем.
Итак, вот мой AndroidManifest:
<manifest ... >
<!-- to be activated service on boot is completed -->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<!-- Keeps the processor from sleeping when a message is received. -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<application ... >
<!-- to receive data when boot completed -->
<receiver
android:name="myPackage.BootReceiver"
android:enabled="true"
android:exported="true"
android:permission="android.permission.RECEIVE_BOOT_COMPLETED" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
</application>
</manifest>
Заранее спасибо.
Редактировать: В моем вещательном приемнике ничего особенного нет, но кому это нужно:
package myPackage
public class BootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Utils.LogI("BootReceiver", "BootReceiver received!");
if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
// Do my stuff
}
}
}
9 ответов
Это ниже вещь работала для меня
AndroidManifest.xml
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application>
<receiver android:name=".BootCompletedReceiver" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
</intent-filter>
</receiver>
<service android:name="NotifyingDailyService" >
</service>
BootCompletedReceiver.class
public class BootCompletedReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent arg1) {
// TODO Auto-generated method stub
Log.w("boot_broadcast_poc", "starting service...");
context.startService(new Intent(context, NotifyingDailyService.class));
}
}
Service.class
public class NotifyingDailyService extends Service {
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public int onStartCommand(Intent pIntent, int flags, int startId) {
// TODO Auto-generated method stub
Toast.makeText(this, "NotifyingDailyService", Toast.LENGTH_LONG).show();
Log.i("com.example.bootbroadcastpoc","NotifyingDailyService");
return super.onStartCommand(pIntent, flags, startId);
}
}
Это старый и основной вопрос, но многие разработчики Android все еще не понимают эту проблему, потому что ОНИ НЕ ТРАТЯТ ВРЕМЯ, ЧТОБЫ ВНИМАТЕЛЬНО ПРОЧИТАТЬ ДОКУМЕНТЫ
Я видел, что кто-то поделился некоторыми ссылками и сказал, что: "Это больше не будет работать" Это совершенно неправильно и неправильно понято.
Об этой проблеме: "Я видел ответ, в котором сказано, что BOOT_COMPLETED не отправляется в приложение, пока пользователь не запустит ваше приложение первым, после Android версии 3.1", пожалуйста, прочитайте эти строки (из официальных документов: https://developer.android.com/about/versions/android-3.1.html) чтобы правильно понять:
Обратите внимание, что состояние остановки приложения отличается от состояния остановки действия. Система управляет этими двумя остановленными состояниями отдельно.
Приложения находятся в остановленном состоянии, когда они впервые установлены, но еще не запущены, и когда они вручную остановлены пользователем (в разделе " Управление приложениями"). (Они означают, что приложение остановит приложение)
Это означает, что пользователь должен запустить приложение как минимум один раз после установки, чтобы активировать приложение, после чего приложение может получать неявные трансляции из ОС в обычном режиме. (Только один раз когда-либо запускал!)
"Есть ли какое-либо приложение, которое устанавливается и никогда не открывается, хотя бы один раз?" Да, это спам и мошеннические приложения, эта техника помогает пользователю предотвратить это!
ДАЛЕЕ, ДО СЕЙЧАС (Android Oreo 8.0), когда Android ограничивает регистрацию неявных трансляций на Манифесте ( https://developer.android.com/about/versions/oreo/background.html), некоторые трансляции в настоящее время все еще освобождаются от этих ограничения. И BOOT_COMPLETED - первое, что они упоминают! ( https://developer.android.com/guide/components/broadcast-exceptions.html)
Кстати, это лучшее решение, которое я нашел для этого вопроса:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<receiver android:name=".BootReceiver" android:enabled="true" android:exported="true">
<intent-filter>
<category android:name="android.intent.category.DEFAULT"/>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.intent.action.QUICKBOOT_POWERON"/>
<!--For HTC devices-->
<action android:name="com.htc.intent.action.QUICKBOOT_POWERON"/>
</intent-filter>
</receiver>
Наконец, внимательно прочитайте документ и дважды продумайте код:3!
Некоторые новые планшеты и устройства Android имеют приложения безопасности по умолчанию. иногда эти приложения блокируют режим автозапуска. Примером этого безопасного приложения является менеджер MyAsus. так что вы можете добавить "разрешить автоматический запуск" в ваших приложениях
А для Htc устройств добавь com.htc.intent.action.QUICKBOOT_POWERON
<receiver android:enabled="true" android:name=".receivers.BootUpReceiver">
<intent-filter>
<category android:name="android.intent.category.DEFAULT" />
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.intent.action.QUICKBOOT_POWERON"/>
<action android:name="com.htc.intent.action.QUICKBOOT_POWERON"/>
</intent-filter>
</receiver>
Для других, у которых все еще есть проблема с этим, как у меня, если вы отлаживаете устройство с блокировкой загрузки (пин-код, шаблон или иначе), версии ОС>= 7.0 должны подписаться на android.intent.action.LOCKED_BOOT_COMPLETED
как показано ниже:
<receiver
android:directBootAware="true"
android:name=".BootCompletedReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT" />
<action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" />
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
</intent-filter>
</receiver>
Вы можете найти документацию по следующей ссылке: https://developer.android.com/training/articles/direct-boot
Проблема с устройством. некоторые устройства позволяют только внутренним приложениям получать это действие (пример: Android 5.1).
Вы можете добавить это к своему фильтру намерений как обходной путь
действие android:name="android.intent.action.USER_PRESENT"
Это срабатывает после того, как пользователь разблокирует устройство.
Проблема, с которой я столкнулся, заключалась в том, что BOOT_COMPLETED
а также QUICKBOOT_POWERON
Совместные действия не всегда вызывали мои намерения, когда я выключал питание с панели Android 6.0.1. Я довольно долго искал в интернете и нашел решение, добавив QUICKBOOT_POWEROFF
в файл манифеста.
Смотрите также:
Если вы достигли этого ответа, и ни один из других ответов не работает, дважды проверьте строку действия в манифесте. AndroidStudio не показывает никаких ошибок, если вы пишете неправильную строку в
action
ярлык. Не путайте имя константы в коде, т.е.ACTION_BOOT_COMPLETED
, со значением указанной константы, которая указана в манифесте и равна
android.intent.action.BOOT_COMPLETED
TL;DR Убедитесь, что у вас есть это в манифесте:
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
А не это:
<intent-filter>
<action android:name="android.intent.action.ACTION_BOOT_COMPLETED" />
</intent-filter>
Для обходного пути вам необходимо создать службу NotificationListener
если устройство>= Build.VERSION_CODES.JELLY_BEAN_MR2 и имеет опцию оптимизации батареи, как в устройствах Huawei, тогда вам нужно запросить разрешение NotificationListener и создать службу NotificationListener, как в приведенном ниже коде, тогда вы получите BOOT_COMPLETED в своем приемнике
Получатель манифеста:
<receiver
android:name=".TestRes"
android:enabled="true"
android:exported="true">
<intent-filter android:priority="1">
<category android:name="android.intent.category.DEFAULT"/>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.intent.action.QUICKBOOT_POWERON"/>
<action android:name="android.intent.action.USER_PRESENT"/>
<action android:name="android.intent.action.REBOOT"/>
</intent-filter>
</receiver>
1 создайте службу NotificationListener:
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
public class DevAppNotificationListener extends NotificationListenerService {
@Override
public void onNotificationPosted(StatusBarNotification sbn) {
// super.onNotificationPosted(sbn);
}
@Override
public void onNotificationRemoved(StatusBarNotification sbn) {
// super.onNotificationRemoved(sbn);
}
}
2 проверьте, предоставлен ли NotificationListener или нет:
static boolean CheckNotificationLisPermission(Context context)
{
return NotificationManagerCompat.getEnabledListenerPackages (context).contains(context.getApplicationContext().getPackageName());
}
3, если нет, то запросите разрешение NotificationListener:
Intent intent = new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS");
context.startActivityForResult(intent, callBackResultIntent);