Почему широковещательный приемник не выполняет BOOT_COMPLETED и не отображает всплывающее сообщение?

  • Я пробую простой пример с широковещательным приемником, зарегистрированным с помощью действия BOOT_COMPLETED... но приложение не выдает всплывающее сообщение... Я много искал... пробовал оба способа регистрации приемника в manifest.xml и в java-коде. .. но я действительно не знаю, в чем проблема в нем...
  • пожалуйста, помогите мне разобраться с этой проблемой, так как мне нужно запустить службу при загрузке ..
  • заранее спасибо..

1) Класс активности

public class BootReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent arg1) {
        Toast.makeText(context, "Boot is completed..", Toast.LENGTH_SHORT).show();
    }
} 

2) манифест.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.bootupservicedemoagain"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="21" />

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <receiver android:name="com.example.bootupservicedemoagain.BootReceiver" >
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />

                <category android:name="android.intent.category.HOME" />
            </intent-filter>
        </receiver>
    </application>

</manifest>

Я также пробовал это в методе класса активности onReceive, но тот же результат!

if(intent.getAction() != null) 
{
    if(intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED))
    {
        Toast.makeText(context, "Boot is completed..", Toast.LENGTH_SHORT).show();
    }
}

person android devlpr    schedule 31.07.2014    source источник


Ответы (4)


Попробуйте разрешение действия android.intent.action.QUICKBOOT_POWERON для вашего фильтра намерений. Это решило ту же проблему для меня. Ваше объявление получателя в файле манифеста должно выглядеть так:

 <receiver android:name="com.example.bootupservicedemoagain.BootReceiver" >
    <intent-filter>
       <action android:name="android.intent.action.BOOT_COMPLETED" />
       <action android:name="android.intent.action.QUICKBOOT_POWERON" />
    </intent-filter>
 </receiver>

Также не нужна категория <category android:name="android.intent.category.HOME" />.

person droid8421    schedule 31.07.2014
comment
тот же вывод... сообщение не отображается - person android devlpr; 31.07.2014
comment
какое у тебя устройство? Я также пробовал на Samsung, htc, micromax tab, эмуляторе ... но тот же результат - person android devlpr; 31.07.2014
comment
LG Optimus G, Galaxy Tab 2 10.1 - person droid8421; 31.07.2014

Похоже, что разница между моей регистрацией и вашей регистрацией вашего загрузочного ресивера заключается в категории в манифесте.

<category android:name="android.intent.category.HOME" />

Подумайте об удалении этой строки и повторите попытку.

Редактировать с помощью моего кода

public class OnBootReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        /**
         * The onReceive method is a default method which is called when the broadcast
         * receiver is registered and the intent with the action below is sent.
         * This action will start the service. ACTION_BOOT_COMPLETED is defined in the 
         * AndroidManifest.xml.
         */
        if (Intent.ACTION_BOOT_COMPLETED.equalsIgnoreCase(intent.getAction())) {
            Intent myIntent = new Intent(context, MyService.class);
            context.startService(myIntent);
        }

    }

}

Манифест

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

<!-- Handling for On Boot Receiver -->
    <receiver android:name="path.to.OnBootReceiver" >
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>
    <!-- End Handling for On Boot Receiver -->

<service
    android:name="path.to.service"
    android:enabled="true"
    android:exported="false" >
</service>
person Orion    schedule 31.07.2014
comment
какое у тебя устройство? Я также пробовал на Samsung, htc, micromax tab, эмуляторе ... но тот же результат - person android devlpr; 31.07.2014
comment
Nexus 5, Moto G и HTC Desire HD со специальной прошивкой. Также я только что понял, что если у вас нет контекста в широковещательном приемнике, довольно сложно отправить всплывающее сообщение. Покажите всплывающее сообщение в сервисе и повторите попытку. Вероятно, у вас есть контекст приложения, и вы не можете отобразить всплывающее сообщение. - person Orion; 31.07.2014
comment
не сработало... Я действительно не понимаю, в чем проблема? так как все коды правильные .. помощь приветствуется .. спасибо - person android devlpr; 31.07.2014
comment
Когда я отлаживал это, я использовал службу для отображения всплывающих сообщений, а не широковещательный приемник. Каждый раз, когда я запускал телефон, я получал спам с почтовыми сообщениями всех методов жизненного цикла (oncreate и т. д.). - person Orion; 31.07.2014
comment
Я также заметил, что у вас нет службы в манифесте. Смотрите мою правку. - person Orion; 31.07.2014
comment
Я много раз работал над широковещательным приемником за последний год, но никогда не сталкивался с действием BOOT_COMPLETED... Я действительно не понимаю, в чем проблема... - person android devlpr; 31.07.2014
comment
Вы уверены, что определили службу в своем манифесте? Он не может найти службу, если ее нет в манифесте. - person Orion; 31.07.2014

Ну, у меня работает следующая комбинация: в файле манифеста

        <!-- Get Boot Action -->
    <receiver
        android:name="com.example.try.BootBroadcast"
        android:enabled="true"
        android:exported="true"
        android:label="MintBootReceiver"
        android:permission="android.permission.RECEIVE_BOOT_COMPLETED" >
        <intent-filter>
            <action android:name="android.intent.action.ACTION_BOOT_COMPLETED" />
            <action android:name="android.intent.action.BOOT_COMPLETED" >
                <action android:name="android.intent.action.QUICKBOOT_POWERON" />
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.HOME" />
                <category android:name="android.intent.category.LAUNCHER" />
                <category android:name="android.intent.category.DEFAULT" />
            </action>
        </intent-filter>

а для JAVA Broadcast это как у вас

public class BootBroadcast extends BroadcastReceiver {

// Strings - Log
final String TAG = "BootBroadCast";

@Override
public void onReceive(Context mBootCtx, Intent mBootIntent) {
    Log.i(TAG, "BootBroadCast BroadcastReceiver +++STARTED+++");
    Log.d(TAG, "@Boot actionCaught :" + mBootIntent.getAction());
        if ("android.intent.action.BOOT_COMPLETED".equals(mBootIntent
                .getAction())) {
            Log.d(TAG, "@Boot actionCaught :" + mBootIntent.getAction());
            // Now you are getting your Boot reciever
        }
    Log.i(TAG, "BootBroadCast BroadcastReceiver ---END/FIN---");
}

Пожалуйста, скажите мне, помогло ли это.

person ahmedibrahim085    schedule 29.10.2014
comment
Зачем нам android.intent.action.ACTION_BOOT_COMPLETED? - person IgorGanapolsky; 09.06.2020
comment
@IgorGanapolsky, когда я тестировал его, он был основан на устройстве, некоторые устройства (производители) слушали ACTION_BOOT_COMPLETED, а другие BOOT_COMPLETED - person ahmedibrahim085; 08.07.2020

Иногда возникает проблема с полным путем к получателю. Попробуйте относительный

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.QUICKBOOT_POWERON" />
    <receiver
        android:name=".BootReceiver" >
        <intent-filter>
            <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>
person Denys_Sh    schedule 22.02.2017
comment
Проект не скомпилируется, если путь неверный. - person IgorGanapolsky; 09.06.2020