My android location service killed when app switched to background
android, android-location
Solution
Since Android 4.0, the OS has gotten much more agressive about killing off unnecessary processes. If you need to track the user's location even when your app is in the background, then you need to declare your service as a foreground service. This raises the priority of your service so that Android is unlikely to kill it unless it really needs the resources. See Running a service in the foreground for details about how to do this.
Problem
Please apologize me if my question is repeated or simple. Struggling in this issue for a long time. I need to track user's location even when my app is switched to background. On surfing I found that the location processor code can be written as a service, so that the service will not be killed and we can get the user's location (in both status - app in foreground and when app runs in background). When my app is in foreground, I was able to track user's location continuously. However, when I switched the app to background, I feel my location service dies and I was not able to track user's location. Please find my code below: AndroidManifest.xml: ``` <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.testmylocation" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="15" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/title_activity_main" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name=".MyService"/> </application> </manifest> ``` MainActivity.java: ``` package com.example.testmylocation; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.view.Menu; import android.view.Window; public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); startService(new Intent(this, MyService.class)); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } } ``` MyService.java: ``` package com.example.testmylocation; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.URL; import java.net.URLConnection; import java.text.SimpleDateFormat; import java.util.Date; import org.json.JSONArray; import org.json.JSONObject; import android.app.Service; import android.content.Context; import android.content.Intent; import android.location.Location; import android.location.LocationManager; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.util.Log; public class MyService extends Service { private static final String TAG = "TestMyLocation"; private LocationManager mLocationManager = null; private static final int LOCATION_INTERVAL = 0; private static final float LOCATION_DISTANCE = 0; long itsBatchId = 0; private class LocationListener implements android.location.LocationListener { Location mLastLocation; public LocationListener(String provider) { mLastLocation = new Location(provider); } @Override public void onLocationChanged(Location location) { Thread aThread = new Thread(new Runnable() { @Override public void run() { sendLocationValues(location); } }); aThread.start(); } @Override public void onProviderDisabled(String provider) { Log.e(TAG, "onProviderDisabled: " + provider); } @Override public void onProviderEnabled(String provider) { Log.e(TAG, "onProviderEnabled: " + provider); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { Log.e(TAG, "onStatusChanged: " + provider); } } private void sendLocationValues(Location theLocation) { //A web service will be called and the user's current location will be stored in server } LocationListener[] mLocationListeners = new LocationListener[] { new LocationListener(LocationManager.GPS_PROVIDER), new LocationListener(LocationManager.NETWORK_PROVIDER) }; @Override public IBinder onBind(Intent arg0) { return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { super.onStartCommand(intent, flags, startId); return START_STICKY; } @Override public void onCreate() { initializeLocationManager(); itsLocationHandler.sendEmptyMessage(1); } private Handler itsLocationHandler = new Handler() { @Override public void handleMessage(Message theMessage) { if(theMessage.what == 1) { try { mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, LOCATION_INTERVAL, LOCATION_DISTANCE, mLocationListeners[1]); } catch (java.lang.SecurityException ex) { Log.i(TAG, "fail to request location update, ignore", ex); } catch (IllegalArgumentException ex) { Log.d(TAG, "network provider does not exist, " + ex.getMessage()); } } } }; @Override public void onDestroy() { super.onDestroy(); } private void initializeLocationManager() { if (mLocationManager == null) { mLocationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE); } } } ``` Can anyone please correct what I am doing wrong. Thank you.