Search code examples
javaandroidandroid-fragmentsalarmmanager

AlarmReceiver never receives a call from Fragment


I am trying to set an alarm within the Fragment.

AlarmManager manager = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE);

Intent alarmIntent = new Intent(getActivity(), AlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getService(getActivity(), 0, alarmIntent, 0);

Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 19);
calendar.set(Calendar.MINUTE, 23);

manager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 1000 * 60 * 3600, pendingIntent);

And my AlarmReceiver class is:

public class AlarmReceiver extends BroadcastReceiver {
    private static final String TAG = "MainFragment";
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i(TAG, "onReceive");
        Toast.makeText(context, "I'm running", Toast.LENGTH_LONG).show();
    }
}

This log and toast are never shown.

In my AndroidManifest i have put

<receiver android:name=".AlarmReceiver"
            android:enabled="true"
            android:exported="true"></receiver>

Am I missing something? This is my first project in Android so its probably some rookie mistake.


Solution

  • Here is example which is working TESTED:

    AlarmManager manager = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
    
    Intent alarmIntent = new Intent(this.getApplicationContext(), AlarmReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), 0, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.add(Calendar.SECOND, 30);
    
    manager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 1000 * 60 * 3600, pendingIntent);
    

    If it doesn't work I can send you the working project I made.