title: Estimote iBeacon: Monitoring in background (Android)
body: <p>I would like to have push notifications when my app is open but is in background. For now I have changed the Estimote Demo, and my app gives me a notification when my app is in foreground which is not much of use.
  I post here my code of NotifyDemoActivity class which is called as soon as I open the app</p>
  
  <pre><code>public class NotifyDemoActivity extends Activity {
    private static final String TAG = NotifyDemoActivity.class.getSimpleName();
    private static final int NOTIFICATION_ID = 123;
    private BeaconManager beaconManager;
    private NotificationManager notificationManager;
    private Region region;
    private long[] mVibratePattern = { 0, 200, 200, 300 };
  
    @Override
    protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.notify_demo);
      getActionBar().setDisplayHomeAsUpEnabled(true);
  
      beacon.getMinor());
      region = new Region("rid", null, null, null);
      notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
      beaconManager = new BeaconManager(this);
  
      beaconManager.setBackgroundScanPeriod(TimeUnit.SECONDS.toMillis(1), 0);
  
      beaconManager.setMonitoringListener(new MonitoringListener() {
        @Override
        public void onEnteredRegion(Region region, List&lt;Beacon&gt; beacons) {
          postNotification("Entered region");
        }
  
        @Override
        public void onExitedRegion(Region region) {
          postNotification("Exited region");
        }
      });
    }
  
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
      if (item.getItemId() == android.R.id.home) {
        finish();
        return true;
      }
      return super.onOptionsItemSelected(item);
    }
  
    @Override
    protected void onResume() {
      super.onResume();
      notificationManager.cancel(NOTIFICATION_ID);
      beaconManager.connect(new BeaconManager.ServiceReadyCallback() {
        @Override
        public void onServiceReady() {
          try {
            beaconManager.startMonitoring(region);
          } catch (RemoteException e) {
            Log.d(TAG, "Error while starting monitoring");
          }
        }
      });
    }
  
    @Override
    protected void onDestroy() {
      notificationManager.cancel(NOTIFICATION_ID);
      beaconManager.disconnect();
      super.onDestroy();
    }
  
    private void postNotification(String msg) {
      Intent notifyIntent = new Intent(NotifyDemoActivity.this, NotifyDemoActivity.class);
      notifyIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
      PendingIntent pendingIntent = PendingIntent.getActivities(
        NotifyDemoActivity.this,
        0,
        new Intent[]{notifyIntent},
        PendingIntent.FLAG_UPDATE_CURRENT);
      Notification notification = new Notification.Builder(NotifyDemoActivity.this)
      .setSmallIcon(R.drawable.beacon_gray)
      .setContentTitle("Notify Demo")
      .setContentText(msg)
      .setAutoCancel(true)
      .setContentIntent(pendingIntent)
      .setVibrate(mVibratePattern)
      .build();
      notification.defaults |= Notification.DEFAULT_SOUND;
      notification.defaults |= Notification.DEFAULT_LIGHTS;
      notificationManager.notify(NOTIFICATION_ID, notification);
  
      TextView statusTextView = (TextView) findViewById(R.id.status);
      statusTextView.setText(msg);
    }
  }
  </code></pre>