'BroadcastReceiver not working when app is not running

In my manifest file I have declared the receiver. (as follows)

<receiver android:name=".OnAlarmReceive" />

however, once I shut down my application, I am not able to get the alarms and the notifications. Apparently, a call to the OnReceive in my Broadcast receiver is never made.

public class OnAlarmReceive extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent arg1)
   {
       //various stuff
   }
}

Inside the MainActivity, my alarm manager class is as the follows.

AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
    Intent intent = new Intent("MY_ALARM_NOTIFICATION");
    intent.setClass(this, OnAlarmReceive.class);
    intent.putExtra("message", message);
    PendingIntent pendingIntent = PendingIntent
            .getBroadcast(MainActivity.this, 0, intent,
                    PendingIntent.FLAG_UPDATE_CURRENT);

    Calendar timeCal = Calendar.getInstance();
    timeCal.set(Calendar.HOUR_OF_DAY, hour);
    timeCal.set(Calendar.MINUTE, minutes);

    alarmManager.set(AlarmManager.RTC_WAKEUP, timeCal.getTimeInMillis(), pendingIntent);

and my manifest as is follows :

    <receiver android:name=".OnAlarmReceive">
    <intent-filter android:priority="1">  
        <action android:name="MY_ALARM_NOTIFICATION"/>  
    </intent-filter>  
</receiver>  

What should I do in order to receive the notifications/alarms even if I have shut off my app. Background service ?



Solution 1:[1]

you should add intent-filter in manifest,as

receiver android:name=".SmsBroadCastReceiver">  
        <intent-filter android:priority="20">  
            <action android:name="android.provider.Telephony.SMS_RECEIVED"/>  
        </intent-filter>  
    </receiver>  

Solution 2:[2]

As Gong Cong says, you need to declare which events your receiver should listen.

For example :

<receiver android:name=".OnAlarmReceive"> 

<intent-filter>  
    <action android:name="MY_ALARM_NOTIFICATION"/>
</intent-filter> </receiver> 

and then when your set your alarm, use an intent with your action :

Intent intent = new Intent("MY_ALARM_NOTIFICATION");
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
PendingIntent pi = PendingIntent.getBroadcast( this, 0, intent, 0 );

Solution 3:[3]

Your code is working fine!

All you have to do is to change this line:

alarmManager.set(AlarmManager.RTC_WAKEUP, timeCal.getTimeInMillis(),
pendingIntent);

With this line:

alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
SystemClock.elapsedRealtime() + 5000, pendingIntent);

And the code in the "onReceive" will run after 5000ms (5sec) even when app is not running

Solution 4:[4]

In My understanding, In some cased depending on the way of implementations, OS has authority to adjust the alarm set time. So try to use AlarmManager.set(...), AlarmManager.setexact(...) etc accordingly. In Some cases, depending on the manufacturer(Custom Android OS), there is a possibility that the OS is blocking fire alarm.

Solution 5:[5]

Adding android:exported="true" for receiver in manifest file helped me to receive alarms (and thus, wake the application) even when application was shut-down (intentionally by me, removing app from task list).

Solution 6:[6]

1.Declare the receiver in the Manifest-file:

<receiver android:name="your.package.name.TestAlarmReceiver"></receiver>

Always remember that the whole Android-System is case sensitive. So check your spelling is correct in the AndroidMainfest.xml.

2.If you create a PendingIntent for your Receiver, please add an requestCode - even it is a random number! Without your onReceive code never get called!

The function which start AlarmManager should look like below:

public static void scheduleTestAlarmReceiver(Context context) {
   Intent receiverIntent = new Intent(context, TestAlarmReceiver.class);
   PendingIntent sender = PendingIntent.getBroadcast(context, 123456789,  receiverIntent, 0);

   AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
   alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime()+startDelay, someDelay, sender);
}

BroadcastReceiver class:

package your.package.name;

public class TestAlarmReceiver extends BroadcastReceiver {
   @Override
   public void onReceive(Context context, Intent arg1) {
     // your code here!
   }
}

The original article: Why my BroadcastReceiver does not get called?

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Gong Cong
Solution 2
Solution 3 David
Solution 4 Nithinjith
Solution 5 Mihail Petrenko
Solution 6