BOOT_COMPLETED не работает
Прежде всего, я знаю, что сотни таких вопросов задавались, но я все время их проверял и до сих пор не нашел решения.
Я видел этот ответ, сказал, что 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
}
}
}
Ответы
Ответ 1
Эта работа для меня работала
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);
}
}
Ответ 2
Это старый и основной вопрос, но многие разработчики Android все еще не понимают эту проблему, потому что ОНИ НЕ ТРАТЯТ ВРЕМЯ, ЧТОБЫ ВНИМАТЕЛЬНО ПРОЧИТАТЬ ДОКУМЕНТЫ
Я видел, что кто-то поделился некоторыми ссылками и сказал, что: "Это больше не будет работать" Это совершенно неправильно и неправильно понято.
Об этой проблеме: "Я видел ответ, в котором сказано, что BOOT_COMPLETED не отправляется в приложение, пока пользователь не запустит ваше приложение первым, после Android версии 3.1", пожалуйста, прочитайте эти строки (из официальных документов: https://developer.android. ru/about/updates/android-3.1.html # launchcontrols) чтобы правильно понять:
-
Обратите внимание, что состояние остановки приложения не совпадает с состоянием остановки действия. Система управляет этими двумя остановленными состояниями отдельно.
-
Приложения находятся в остановленном состоянии, когда они впервые установлены, но еще не запущены, и когда они вручную остановлены пользователем (в разделе " Управление приложениями"). (Они имеют в виду силу, чтобы остановить приложение)
![enter image description here]()
-
Это означает, что пользователь должен запустить приложение как минимум один раз после установки, чтобы активировать приложение, после чего приложение может получать неявные трансляции из ОС в обычном режиме. (Только один раз когда-либо запускал!)
-
"Есть ли какое-либо приложение, которое устанавливается и никогда не открывается хотя бы раз в жизни?" - да, это спам и мошеннические приложения, эта техника помогает пользователю предотвратить это!
ДАЛЕЕ, ДО СЕЙЧАС (Android Oreo 8.0), когда Android ограничивает регистрацию неявных трансляций на Манифесте (https://developer.android.com/about/versions/oreo/background.html#broadcasts), некоторые трансляции в настоящее время по-прежнему освобождаются от этих ограничения. И 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!
Ответ 3
некоторые новые планшеты и устройства Android по умолчанию имеют приложение безопасности. иногда эти приложения блокируют ваш режим автозапуска. примером этого безопасного приложения является менеджер MyAsus. поэтому вы можете добавить "разрешить автоматический запуск" в свои приложения.
Ответ 4
И для устройств 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>
Ответ 5
Проблема с устройством. некоторые устройства позволяют внутренним приложениям получать это действие (например: Android 5.1).
вы можете добавить это в свой фильтр намерений в качестве работы вокруг
действие android:name="android.intent.action.USER_PRESENT"
Это запускается после того, как пользователь разблокирует устройство.
Ответ 6
Проблема, с которой я столкнулся, заключалась в том, что BOOT_COMPLETED
и QUICKBOOT_POWERON
вместе не всегда вызывали мои намерения, когда я выключал питание с панели Android 6.0.1. Я долго искал в Интернете и нашел решение, добавив QUICKBOOT_POWEROFF
в файл манифеста.
Смотрите также:
"Быстрая загрузка" HTC не передает ни BOOT_COMPLETED ни намерение, ни стирание намерений из диспетчера тревоги
Ответ 7
Для обходного пути вам нужно создать сервис 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);