Search code examples
javaandroidbroadcastreceiverinner-classes

BroadcastReceiver inner class not trigger


I'm trying to make a Watch Dog function using an inner class broadcast receiver. On the parent class I registered the broadcast receiver inside the constructor, but the onReceive class is never trigger.

How can I solve this issue ? Thank you.

WatchDog class:

public class WatchDog {
private final String TAG = getClass().getSimpleName();
private static final String RECEIVER_WATCHDOG = "com.example.liviu.test_broadcastreceiver.receiver";
private final static String ACTION_WATCHDOG = "com.example.liviu.test_broadcastreceiver.action.watchdog";
private final static int ID_WATCHDOG = 40856342;
private final static int mTimeout = 1000;

public WatchDog (Context context) {
    Log.d(TAG, ":::::::::::: Watchdog CONSTRUCTOR");
    IntentFilter intentFilter = new IntentFilter(RECEIVER_WATCHDOG);
    BroadcastReceiver receiver = new WatchDogReceiver();
    context.registerReceiver(receiver, intentFilter);
    setWatchdogTimer(context, true, mTimeout);
}

final class WatchDogReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(TAG, ":::::::::::: Watchdog received - ");
        setWatchdogTimer(context, true, mTimeout);
    }
}

public void setWatchdogTimer(Context context, boolean set, int timeout) {
    Log.d(TAG, ":::::::::::: Watchdog START");
    Intent intent = new Intent(context, WatchDogReceiver.class);
    intent.setAction(ACTION_WATCHDOG);
    PendingIntent alarmIntent = PendingIntent.getBroadcast(context, ID_WATCHDOG, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    if (set) {
        alarmManager.set(AlarmManager.RTC, System.currentTimeMillis() + timeout, alarmIntent);
    } else {
        alarmManager.cancel(alarmIntent);
    }
}

}

and MainActivity class:

public class MainActivity extends AppCompatActivity {
private final String TAG = getClass().getSimpleName();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Log.d(TAG, ">>>>>>>>>>>> Activity START");
    new WatchDog(getApplicationContext());
}

}

Logcat is showing only:

05-02 18:11:10.197 20415-20415/com.example.liviu.test_broadcastreceiver D/MainActivity: >>>>>>>>>>>> Activity START
05-02 18:11:10.197 20415-20415/com.example.liviu.test_broadcastreceiver D/WatchDog: :::::::::::: Watchdog CONSTRUCTOR

Solution

  • If you want dynamic register/unregister then register on onResume and unregister on onPause(). If you want to do it statically, register it on manifest and make your nested class static so manifest can instantiate it.