2011-09-12 19 views

Respuesta

0

Puede utilizar un servicio que siempre se ejecuta en segundo plano ... y en el servicio de fondo puede obtener la latitud y longitud actual y puede convertir aún más estos lats y longs en la ubicación adecuada utilizando la clase de geocodificador de Android ... comprobar el siguiente vínculo:

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

+2

Gracias, pero este código es para la actividad, ¿cómo puedo utilizar el servicio. – Dev

0

lo que se va a hacer en actividad se puede realizar en el servicio also..in la onStart() de servicio ....

4

Es necesario utilizar un AlarmManager para activar un intento pendientes (a través de un receptor de radiodifusión) para poner en marcha un servicio en segundo plano.

algunos ejemplos de código para usted

En su MainActivity

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); 

clase 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(); 
     } 
    } 
} 

El 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); 
    } 
} 

El Servicio de fondo. Aquí hasta 2 puntos importantes aviso

  1. WakeLock, para asegurar que su dispositivo se activa y utiliza la red en el fondo
  2. un corte para LocationManager para trabajar. Tuve que depurar esto durante aproximadamente 2 semanas, créanme, lo necesitan. requestLocationUpdates y getLastKnownLocation simplemente no le dará la ubicación cuando lo desee. De ahí el AlarmManager (que funciona mucho mejor que una cosa java TimerTask).

Todo esto funciona en una aplicación de producción en Play 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 
} 

} 

Por último, no se olvide de su cosa manifiesta.

<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> 
+0

¿Qué es la clase de HomeScreen? – ChArAnJiT

Cuestiones relacionadas