Background location service. It will be restarted even after killing the application.
MainActivity.java
public class MainActivity extends AppCompatActivity { AlarmManager alarmManager; Button stop; PendingIntent pendingIntent; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (alarmManager == null) { alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(this, AlarmReceive.class); pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0); alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 30000, pendingIntent); } } }
BookingTrackingService.java
public class BookingTrackingService extends Service implements LocationListener { private static final String TAG = "BookingTrackingService"; private Context context; boolean isGPSEnable = false; boolean isNetworkEnable = false; double latitude, longitude; LocationManager locationManager; Location location; private Handler mHandler = new Handler(); private Timer mTimer = null; long notify_interval = 30000; public double track_lat = 0.0; public double track_lng = 0.0; public static String str_receiver = "servicetutorial.service.receiver"; Intent intent; @Nullable @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); mTimer = new Timer(); mTimer.schedule(new TimerTaskToGetLocation(), 5, notify_interval); intent = new Intent(str_receiver); } @Override public int onStartCommand(Intent intent, int flags, int startId) { this.context = this; return START_NOT_STICKY; } @Override public void onDestroy() { super.onDestroy(); Log.e(TAG, "onDestroy <<"); if (mTimer != null) { mTimer.cancel(); } } private void trackLocation() { Log.e(TAG, "trackLocation"); String TAG_TRACK_LOCATION = "trackLocation"; Map<String, String> params = new HashMap<>(); params.put("latitude", "" + track_lat); params.put("longitude", "" + track_lng); Log.e(TAG, "param_track_location >> " + params.toString()); stopSelf(); mTimer.cancel(); } @Override public void onLocationChanged(Location location) { } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } @Override public void onProviderEnabled(String provider) { } @Override public void onProviderDisabled(String provider) { } private void fn_getlocation() { locationManager = (LocationManager) getApplicationContext().getSystemService(LOCATION_SERVICE); isGPSEnable = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); isNetworkEnable = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); if (!isGPSEnable && !isNetworkEnable) { Log.e(TAG, "CAN'T GET LOCATION"); stopSelf(); } else { if (isNetworkEnable) { location = null; locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000, 0, this); if (locationManager != null) { location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); if (location != null) { Log.e(TAG, "isNetworkEnable latitude" + location.getLatitude() + "\nlongitude" + location.getLongitude() + ""); latitude = location.getLatitude(); longitude = location.getLongitude(); track_lat = latitude; track_lng = longitude;
AlarmReceive.java (BroadcastReceiver)
public class AlarmReceive extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Log.e("Service_call_" , "You are in AlarmReceive class."); Intent background = new Intent(context, BookingTrackingService.class);
AndroidManifest.xml
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <service android:name=".ServiceAndBroadcast.BookingTrackingService" android:enabled="true" /> <receiver android:name=".ServiceAndBroadcast.AlarmReceive" android:exported="false"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver>