uso son significa segundo restringir qué que programacion plano los fondo datos como celular aplicaciones c# android xamarin xamarin.forms xamarin.android

c# - son - qué es el uso de datos en segundo plano



Mantenga el wifi activo en el servicio de primer plano después de que el teléfono entre en suspensión (1)

Quiero recibir paquetes de wifi cuando mi teléfono está bloqueado. El problema es que cuando bloqueo mi pantalla, mi servicio en primer plano deja de recibir paquetes. Estoy usando el servicio de primer plano como este:

public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId) { var notification = new Notification.Builder(this) .SetContentTitle(Resources.GetString(Resource.String.app_name)) .SetContentText(Resources.GetString(Resource.String.notification_text)) .SetSmallIcon(Resource.Drawable.ic_stat_name) .SetContentIntent(BuildIntentToShowMainActivity()) .SetOngoing(true) .AddAction(BuildRestartTimerAction()) .AddAction(BuildStopServiceAction()) .Build(); // Enlist this instance of the service as a foreground service StartForeground(Constants.SERVICE_RUNNING_NOTIFICATION_ID, notification); /*DO THIS EVEN WHEN SCREEN IS LOCKED*/ var powerManager = (PowerManager)GetSystemService(PowerService); _wakeLock = powerManager.NewWakeLock(WakeLockFlags.Partial, "WakeLockTag"); _wakeLock.Acquire(); var wifiManager = (WifiManager)GetSystemService(WifiService); _wifiLock = wifiManager.CreateWifiLock(WifiMode.FullHighPerf, "xamarin_wifi_lock"); _wifiLock.Acquire(); if (!powerManager.IsIgnoringBatteryOptimizations("com.xamarin.xample.foregroundservicedemo") || !_wakeLock.IsHeld || !_wifiLock.IsHeld) throw new InvalidOperationException("OPTIMIZATIONS NOT ACTIVE"); string msg = timestamper.GetFormattedTimestamp(); Log.Debug(TAG, msg); Intent intent = new Intent(Constants.NOTIFICATION_BROADCAST_ACTION); intent.SetAction(Android.Provider.Settings.ActionIgnoreBatteryOptimizationSettings); intent.PutExtra(Constants.BROADCAST_MESSAGE_KEY, msg); LocalBroadcastManager.GetInstance(this).SendBroadcast(intent); Task.Run(() => { using (var client = new UdpClient(12345)) { while (true) { var result = client.ReceiveAsync().Result; Console.WriteLine($"RECEIVED: {result.Buffer.Length}"); } } }); return StartCommandResult.Sticky; }

Estoy haciendo las siguientes cosas para asegurarme de que no se mate :

  1. Inicio del servicio de primer plano
  2. Utilizando StartCommandResult.Sticky
  3. Usando Wake Lock
  4. Usando Wifi Lock
  5. Configuración de WifiSleepPolicy en Never (lo tengo configurado en la configuración de mi teléfono)
  6. Configuración de ActionIgnoreBatteryOptimizationSettings en la intención
  7. Lista blanca de mi aplicación a través del símbolo del sistema adb durante la depuración

¿Qué más me estoy perdiendo? Estoy usando Samsung A5 con Android 6.0 - API 23.

Busqué en los registros del indicador de comandos de adb y verifiqué que mi servicio se está ejecutando como Servicio de primer plano y que todos los bloqueos se mantienen.


Lo que estás haciendo es simplemente genial, todo está bien. ¡¡Sin embargo!!

Echemos un vistazo a la devleport.android.com de devleport.android.com :

Las políticas de Google Play prohíben que las aplicaciones soliciten una exención directa de las funciones de administración de energía en Android 6.0+ (Doze y App Standby) a menos que la función principal de la aplicación se vea afectada negativamente.

Usted declaró:

Estoy usando Samsung A5 con Android 6.0 - API 23.

Lo que significa que no podrá mantener su servicio de primer plano cuando el teléfono se ponga en suspensión porque la función principal de la aplicación no se ve afectada negativamente .

Esta es la razón por la que nota que dejó de recibir paquetes cuando el teléfono está dormido.

Por favor, explore el enlace completo que adjunto y también nosotros la guía de Power Manager .

Edición: ahora me di cuenta de que además:

Si un usuario deja un dispositivo desenchufado y estacionario durante un período de tiempo, con la pantalla apagada, el dispositivo entra en el modo Doze. En el modo Doze, el sistema intenta conservar la batería restringiendo el acceso de las aplicaciones a la red y a los servicios intensivos de CPU. También evita que las aplicaciones accedan a la red y difiere sus trabajos, sincronizaciones y alarmas estándar.

Restricciones de dormitar :

  • El acceso a la red está suspendido.
  • El sistema ignora los bloqueos de activación.
  • Las alarmas de AlarmManager estándar (incluidos setExact () y setWindow ()) se difieren a la siguiente ventana de mantenimiento.
  • Si necesita establecer alarmas que se activen mientras está en Doze, use setAndAllowWhileIdle () o setExactAndAllowWhileIdle ().
  • Las alarmas configuradas con setAlarmClock () continúan disparándose normalmente: el sistema sale de Doze poco antes de que se activen esas alarmas.
  • El sistema no realiza exploraciones de Wi-Fi.
  • El sistema no permite que se ejecuten los adaptadores de sincronización.
  • El sistema no permite que JobScheduler se ejecute.

Esto concluirá mi respuesta a todas sus consultas.

EDIT 2:

Investigué un poco más, hay una publicación completa sobre este tema en Xamarin.Android .

También hay una solución para activar el teléfono cada 10 minutos para evitarlo here .