title: How to add background service in Geofence android
body: <p>I am trying to create a geofence with background service for monitor. The geofence create successfully and work when apps Activity is open but when close the app geofence not work. What should I do now. My code is: </p>
  
  <pre><code>public class MapsActivity extends FragmentActivity implements OnMapReadyCallback,
      GoogleApiClient.ConnectionCallbacks,
      GoogleApiClient.OnConnectionFailedListener,
      LocationListener {
  
  
  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_maps);
      // Obtain the SupportMapFragment and get notified when the map is ready to be used.
      SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
              .findFragmentById(R.id.map);
      mapFragment.getMapAsync(this);
  
      ref = FirebaseDatabase.getInstance().getReference("MyLocation");
      geoFire = new GeoFire(ref);
      mVerticalSeekBar = (VerticalSeekBar)findViewById(R.id.verticalSeekBar);
  
      setUpdateLocation();
  
  }
  
  @Override
  public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
      switch (requestCode) {
          case MY_PERMISSION_REQUEST_CODE:
              if (grantResults.length &gt; 0 &amp;&amp; grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                  if (checkPlayService()) {
                      buildGoogleApiClient();
                      createLocationRequest();
                      displayLocation();
                  }
              }
              break;
      }
  }
  
  private void setUpdateLocation() {
      if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED &amp;&amp;
              ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
          ActivityCompat.requestPermissions(this, new String[]{
                  Manifest.permission.ACCESS_COARSE_LOCATION,
                  Manifest.permission.ACCESS_FINE_LOCATION
          }, MY_PERMISSION_REQUEST_CODE);
      } else {
          if (checkPlayService()) {
              buildGoogleApiClient();
              createLocationRequest();
              displayLocation();
          }
      }
  }
  
  private void displayLocation() {
      if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED &amp;&amp;
              ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
          return;
      }
  
      mLastLocaiton = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
      if (mLastLocaiton != null) {
          final double latitude = mLastLocaiton.getLatitude();
          final double longitude = mLastLocaiton.getLongitude();
  
          geoFire.setLocation("You", new GeoLocation(latitude, longitude), new GeoFire.CompletionListener() {
              @Override
              public void onComplete(String key, DatabaseError error) {
                  if (mCurrent != null)
                      mCurrent.remove();
                  mCurrent = mMap.addMarker(new MarkerOptions()
                          .position(new LatLng(latitude, longitude))
                          .title("You"));
                  LatLng coordinate = new LatLng(latitude, longitude);
                  CameraUpdate yourLocation = CameraUpdateFactory.newLatLngZoom(coordinate, 12);
                  mMap.animateCamera(yourLocation);
              }
          });
  
          Log.d("MRF", String.format("Your last location was chaged: %f / %f", latitude, longitude));
      } else {
          Log.d("MRF", "Can not get your location.");
      }
  }
  
  private void createLocationRequest() {
      mLocationRequest = new LocationRequest();
      mLocationRequest.setInterval(UPDATE_INTERVAL);
      mLocationRequest.setFastestInterval(FATEST_INTERVAL);
      mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
      mLocationRequest.setSmallestDisplacement(DISPLACEMENT);
  }
  
  private void buildGoogleApiClient() {
      mGoogleApiClient = new GoogleApiClient.Builder(this)
              .addConnectionCallbacks(this)
              .addOnConnectionFailedListener(this)
              .addApi(LocationServices.API).build();
      mGoogleApiClient.connect();
  }
  
  private boolean checkPlayService() {
      GoogleApiAvailability googleAPI = GoogleApiAvailability.getInstance();
      int result = googleAPI.isGooglePlayServicesAvailable(this);
      if (result != ConnectionResult.SUCCESS) {
          if (googleAPI.isUserResolvableError(result)) {
              googleAPI.getErrorDialog(this, result, PLAY_SERVICE_RESULATION_REQUEST).show();
          } else {
              Toast.makeText(this, "This Device is not supported.", Toast.LENGTH_SHORT).show();
          }
          return false;
      }
  
      return true;
  }
  
  @Override
  public void onMapReady(GoogleMap googleMap) {
      mMap = googleMap;
  
      LatLng dangerous_area = new LatLng(23.7424236, 90.3942189);
      mMap.addCircle(new CircleOptions()
              .center(dangerous_area)
              .radius(100)
              .strokeColor(Color.BLUE)
              .fillColor(0x220000FF)
              .strokeWidth(5.0f));
  
      //add GeoQuery here
      GeoQuery geoQuery = geoFire.queryAtLocation(new GeoLocation(dangerous_area.latitude, dangerous_area.longitude), 0.1f);
      geoQuery.addGeoQueryEventListener(new GeoQueryEventListener() {
          @Override
          public void onKeyEntered(String key, GeoLocation location) {
              sendNotification("MRF", String.format("%s entered the dangerous area",key));
          }
  
          @Override
          public void onKeyExited(String key) {
              sendNotification("MRF", String.format("%s exit the dangerous area",key));
          }
  
          @Override
          public void onKeyMoved(String key, GeoLocation location) {
              Log.d("MOVE", String.format("%s move within the dangerous area [%f/%f]", key, location.latitude, location.longitude));
          }
  
          @Override
          public void onGeoQueryReady() {
  
          }
  
          @Override
          public void onGeoQueryError(DatabaseError error) {
              Log.d("ERROR", ""+error);
          }
      });
  }
  
  private void sendNotification(String title, String content) {
      Notification.Builder builder = new Notification.Builder(this)
              .setSmallIcon(R.mipmap.ic_launcher)
              .setContentTitle(title)
              .setContentText(content);
  
      NotificationManager manager = (NotificationManager)this.getSystemService(Context.NOTIFICATION_SERVICE);
      Intent intent = new Intent(this, MapsActivity.class);
      PendingIntent contentIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_IMMUTABLE);
      builder.setContentIntent(contentIntent);
      Notification notification = builder.build();
      notification.flags |= Notification.FLAG_AUTO_CANCEL;
      notification.defaults |= Notification.DEFAULT_SOUND;
      manager.notify(new Random().nextInt(), notification);
  }
  
  @Override
  public void onConnected(@Nullable Bundle bundle) {
      displayLocation();
      startLocationUpdate();
  }
  
  private void startLocationUpdate() {
      if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED &amp;&amp;
              ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
          return;
      }
      LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
  }
  
  @Override
  public void onConnectionSuspended(int i) {
      mGoogleApiClient.connect();
  }
  
  @Override
  public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
  
  }
  
  @Override
  public void onLocationChanged(Location location) {
      mLastLocaiton = location;
      displayLocation();
  }
  </code></pre>
  
  <p>github link is: <a href="https://github.com/Farhad2015/Geofence-GeoFire/blob/master/app/src/main/java/com/mahmud/geotesting/MapsActivity.java" rel="noreferrer">https://github.com/Farhad2015/Geofence-GeoFire/blob/master/app/src/main/java/com/mahmud/geotesting/MapsActivity.java</a>  </p>
  
  <p>Please help me to create a background service for monitor geofence from background. </p>