Подтвердить что ты не робот

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
    }
}
}
4b9b3361

Ответ 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

  1. Это означает, что пользователь должен запустить приложение как минимум один раз после установки, чтобы активировать приложение, после чего приложение может получать неявные трансляции из ОС в обычном режиме. (Только один раз когда-либо запускал!)

  2. "Есть ли какое-либо приложение, которое устанавливается и никогда не открывается хотя бы раз в жизни?" - да, это спам и мошеннические приложения, эта техника помогает пользователю предотвратить это!

ДАЛЕЕ, ДО СЕЙЧАС (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);