studio son servicios segundo que procesos plano permisos los las evitar esta ejecutar ejecutando ejecutan como app aplicaciones android service gps

son - servicios android 8



Ejecuta el oyente GPS en segundo plano en Android (4)

Me gustaría saber cómo recibir el GPS cuando la aplicación de Android está en segundo plano. ¿Hay un tutorial completo para explicarlo?


Lo que harás en Activity también se puede hacer en servicio ... en el inicio de servicio (onStart).


Puede usar un servicio que siempre se ejecuta en segundo plano ... y en el servicio en segundo plano puede obtener la latitud y la longitud actuales y puede convertir aún más estos lats y longs en la ubicación adecuada utilizando la clase de geocodificador de Android ... revise el siguiente enlace :

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


Necesita activar un AlarmManager para activar un intento pendiente (a través de un receptor de difusión) para iniciar un servicio en segundo plano.

Un código de muestra para ti

En su actividad principal

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 el aviso 2 puntos importantes

  1. WakeLock, para garantizar que su dispositivo se active y use la red en segundo plano
  2. Un truco para que LocationManager funcione. 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 olvides tu 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>