Search code examples
androideventsgpsbroadcastreceiver

Why does Broadcast Receiver never get called?


Inside my MainActivity I am creating a receiver and sending a broadcast:

GPSStartedReceiver receiver = new GPSStartedReceiver();
this.registerReceiver(receiver, new IntentFilter("android.location.GPS_ENABLED_CHANGE"));
Intent intent = new Intent();
intent.setAction("com.test.broadcastReceiver.GPSStartedReceiver()");
sendBroadcast(intent);

But when I enable my GPS, the broadcast receiver is not being called.

Below is the part of the receiver in the Manifest:

<receiver android:name="com.test.broadcastReceiver.GPSStartedReceiver">
        <intent-filter>
            <action android:name="android.location.GPS_ENABLED_CHANGE" />
        </intent-filter>
</receiver>

And the Broadcast Receiver:

    public class GPSStartedReceiver extends BroadcastReceiver {

    // Start service 5 seconds after GPS is enabled
    private static final long WAIT_TIME = 1000 * 5;
    // Restart service every 30 seconds
    private static final long REPEAT_TIME = 1000 * 30;

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

        if (intent.getAction().equals("android.location.GPS_ENABLED_CHANGE")) {

            final Handler handler = new Handler();

            Toast.makeText(context,
                    context.getResources().getString(R.string.starting_in_5),
                    Toast.LENGTH_SHORT).show();

            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    AlarmManager service = (AlarmManager) context
                            .getSystemService(Context.ALARM_SERVICE);
                    Intent i = new Intent(context, GPSTracker.class);
                    PendingIntent pending = PendingIntent.getBroadcast(context, 0, i,
                            PendingIntent.FLAG_CANCEL_CURRENT);
                    Calendar cal = Calendar.getInstance();
                    // Start 30 seconds after boot completed
                    cal.add(Calendar.SECOND, 30);
                    // Fetch every 30 seconds
                    service.setInexactRepeating(AlarmManager.RTC_WAKEUP,
                            cal.getTimeInMillis(), REPEAT_TIME, pending);
                }
            }, WAIT_TIME);

        }
    }
}

Why does the receiver never get called, even though I enable my GPS?


Solution

  • Use PROVIDERS_CHANGED_ACTION Added in API level 9 Broadcast intent action when the configured location providers change. For use with isProviderEnabled(String). If you're interacting with the LOCATION_MODE API, use MODE_CHANGED_ACTION instead.

    Constant Value: "android.location.PROVIDERS_CHANGED"

    You can find your solution on this SO post