Run GPS receiver in background on Android

I would like to know how to get GPS when the Android app is in the background. Is there a complete tutorial to explain this?

+7
source share
4 answers

You need to use AlarmManager to activate the pending intent (via the broadcast receiver) to start the background service.

Sample code for you

In your main business

AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); Intent notifyintent = new Intent(this, OnAlarmReceiver.class); notifyintent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); notifyintent.setAction("android.intent.action.NOTIFY"); PendingIntent notifysender = PendingIntent.getBroadcast(this, 0, notifyintent, PendingIntent.FLAG_UPDATE_CURRENT); am.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 20 * 1000, notifysender); 

Class AlarmReceiver

 public class OnAlarmReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // PullPendingRequests.acquireStaticLock(context) try { lock = getLock(context); lock.acquire(); context.startService(new Intent(context, UpdateCustomerRequests.class)); } finally { if (lock.isHeld()) { lock.release(); } } } 

BroadcastReceiver

 private static final String NAME = "com.commonsware.cwac.wakeful.WakefulIntentService"; private static volatile PowerManager.WakeLock lockStatic = null; private static PowerManager.WakeLock lock; // Needed since network will to work when device is sleeping. synchronized private static PowerManager.WakeLock getLock(Context context) { if (lockStatic == null) { PowerManager mgr = (PowerManager) context.getSystemService(Context.POWER_SERVICE); lockStatic = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, NAME); lockStatic.setReferenceCounted(true); } return (lockStatic); } } 

Background service. Here you will notice 2 important points.

  1. WakeLock to make sure your device wakes up and uses the network in the background
  2. Hacking for LocationManager to work. I had to debug this for about 2 weeks, believe me, you need it. requestLocationUpdates and getLastKnownLocation simply will not indicate your location whenever you want. Hence AlarmManager (which works much better than Java TimerTask).

All this works in the production application in the game store.

 public class UpdateCustomerRequests extends IntentService implements LocationListener { private static Context mainContext; public UpdateCustomerRequests() { super("UpdateCustomerRequests"); mHandler = new Handler(); me = this; } public static UpdateCustomerRequests getService() { if (me == null) me = new UpdateCustomerRequests(); return me; } @Override final protected void onHandleIntent(Intent intent) { mainContext = getApplicationContext(); Location myLocation; if (HomeScreen.getLocationManager() != null) { // this is needed to trigger a background location change. Since LocationManager does not work on Samsung phones. Its a hack needed. HomeScreen.getLocationManager().requestLocationUpdates( LocationManager.NETWORK_PROVIDER, 0, 0, new LocationListener() { @Override public void onStatusChanged(String provider, int status, Bundle extras) { } @Override public void onProviderEnabled(String provider) { } @Override public void onProviderDisabled(String provider) { } @Override public void onLocationChanged(final Location location) { } }); myLocation = HomeScreen.getLocationManager().getLastKnownLocation( LocationManager.NETWORK_PROVIDER); if (myLocation != null) onLocationChanged(myLocation); else { God.notifications.setSpeedNotification(); } } else Log.e("Taxeeta:PullPendingRequets", "Not activated"); } @Override public void onLocationChanged(final Location location) { // Do your background stuff } } 

Finally, do not forget your obvious thing.

  <service android:name="com.taxeeta.UpdateCustomerRequests" android:enabled="true" android:label="@string/app_name" android:screenOrientation="portrait" android:theme="@android:style/Theme.Light.NoTitleBar" /> <receiver android:name="com.taxeeta.support.OnAlarmReceiver" android:exported="true" > <intent-filter> <action android:name="android.intent.action.NOTIFY" /> </intent-filter> </receiver> <receiver android:name="com.taxeeta.HomeScreen$ResponseReceiver" android:exported="true" > <intent-filter> <action android:name="com.taxeeta.intent.action.GET_SCREEN_UPDATES" /> </intent-filter> </receiver> 
+4
source

You need to use a service concept instead of activity. http://developer.android.com/guide/components/services.html

Here is a good example: Background service should send GPS location on server

+1
source

You can use the Service, which always works in the background .. and in the background you can get the current latitude and longitude, and you can additionally convert these lats and long positions to the desired location using the Android geocoding class ... check the link:

http://www.codeproject.com/KB/android/GPSLocator.aspx

0
source

The thing that you will do in Activity can also be done in the service ... in the onStart () of the service ....

0
source

All Articles