áreas visuales una trabajo tareas tabla stps resumen refiere reconocimiento recomendados nom niveles mexico los las iluminación iluminacion estudio empresa elementos descripción condiciones android service background-process battery

android - visuales - tabla de niveles de iluminacion



Verificando el nivel de batería en el fondo con un servicio (2)

En lugar de utilizar un servicio de larga duración, use un AlarmManager para activar alarmas periódicamente, que pueden ser recibidas por un BroadcastReceiver y pueden llamar a un Servicio (que debe detenerse en algún momento) o un Servicio de Intento para realizar su verificación de batería. Esto causará la menor pena para el usuario, ya que utilizará menos recursos para mantener su aplicación haciendo lo que debe hacer, y menos dolor para usted, ya que será menos probable que el sistema mate su aplicación que se ejecuta sin parar.

Por ejemplo, para un receptor de alarma:

public class AlarmReceiver extends BroadcastReceiver { private static final String TAG = "AlarmReceiver"; private static final int REQUEST_CODE = 777; public static final long ALARM_INTERVAL = DateUtils.MINUTE_IN_MILLIS; // Call this from your service public static void startAlarms(final Context context) { final AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); // start alarm right away manager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, 0, ALARM_INTERVAL, getAlarmIntent(context)); } /* * Creates the PendingIntent used for alarms of this receiver. */ private static PendingIntent getAlarmIntent(final Context context) { return PendingIntent.getBroadcast(context, REQUEST_CODE, new Intent(context, AlarmReceiver.class), PendingIntent.FLAG_UPDATE_CURRENT); } @Override public void onReceive(final Context context, final Intent intent) { if (context == null) { // Somehow you''ve lost your context; this really shouldn''t happen return; } if (intent == null){ // No intent was passed to your receiver; this also really shouldn''t happen return; } if (intent.getAction() == null) { // If you called your Receiver explicitly, this is what you should expect to happen Intent monitorIntent = new Intent(context, YourService.class); monitorIntent.putExtra(YourService.BATTERY_UPDATE, true); context.startService(monitorIntent); } } }

Para su receptor de arranque:

public class BootReceiver extends BroadcastReceiver{ private static final String TAG = "BootReceiver"; private static final String ACTION_BOOT = "android.intent.action.BOOT_COMPLETED"; @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equalsIgnoreCase(ACTION_BOOT)) { // This intent action can only be set by the Android system after a boot Intent monitorIntent = new Intent(context, YourService.class); monitorIntent.putExtra(YourService.HANDLE_REBOOT, true); context.startService(monitorIntent); } } }

Y para su Servicio:

public class YourService extends Service { private static final String TAG = "YourService"; public static final String BATTERY_UPDATE = "battery"; @Override public int onStartCommand(Intent intent, int flags, int startId) { if (intent != null && intent.hasExtra(BootReceiver.ACTION_BOOT)){ AlarmReceiver.startAlarms(YourService.this.getApplicationContext()); } if (intent != null && intent.hasExtra(BATTERY_UPDATE)){ new BatteryCheckAsync().execute(); } return START_STICKY; } @Override public IBinder onBind(Intent intent) { return null; } private class BatteryCheckAsync extends AsyncTask<Void, Void, Void>{ @Override protected Void doInBackground(Void... arg0) { //Battery State check - create log entries of current battery state IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); Intent batteryStatus = YourService.this.registerReceiver(null, ifilter); int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1); boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL; Log.i("BatteryInfo", "Battery is charging: " + isCharging); int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1); Log.i("BatteryInfo", "Battery charge level: " + (level / (float)scale)); return null; } protected void onPostExecute(){ YourService.this.stopSelf(); } } }

En tu manifiesto, deberás agregar:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <!-- Services --> <service android:name="com.your.package.YourService" android:enabled="true" android:exported="false" android:label="@string/app_name" > </service> <!-- Receivers --> <receiver android:name="com.your.package.AlarmReceiver" android:enabled="true" /> <receiver android:name="com.your.package.BootReceiver" android:enabled="true" android:exported="true" > <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver>

He buscado mucho pero siempre estoy más confundido.

Tengo que crear una aplicación que funcione en segundo plano y verifique el nivel de la batería. ¿Cómo puedo crear el servicio? El Servicio debe comenzar en el arranque del dispositivo y debe comunicarse con la Actividad cuando la batería alcance un cierto porcentaje, de modo que no haya ninguna interacción del consumidor.

¿Qué tipo de servicio tengo que crear? ¿Cuáles son las cosas que tengo que hacer?


No necesitas un Servicio. Incluya un receptor de difusión en su aplicación que escuche la transmisión Intent.ACTION_BATTERY_CHANGED. Defina ese receptor de difusión en su Manifiesto de aplicación y se iniciará automáticamente cada vez que haya un cambio de estado de la batería.

Las transmisiones incluyen información sobre el estado actual de la batería, por lo que no hay necesidad de una solución elaborada (¡y muy cara!) Para sondear esta información.

Esta página proporcionará todos los detalles.

Una cita interesante de esa página:

No se puede monitorear continuamente el estado de la batería, pero no es necesario.

En general, el impacto de monitorear constantemente el nivel de batería tiene un mayor impacto en la batería que el comportamiento normal de la aplicación, por lo que es una buena práctica monitorear solo cambios significativos en el nivel de la batería, específicamente cuando el dispositivo ingresa o sale de un estado de batería baja.

El fragmento de manifiesto a continuación se extrae del elemento de filtro de intención dentro de un receptor de difusión. El receptor se activa siempre que la batería del dispositivo se agota o sale de su condición baja escuchando ACTION_BATTERY_LOW y ACTION_BATTERY_OKAY.

<receiver android:name=".BatteryLevelReceiver"> <intent-filter> <action android:name="android.intent.action.ACTION_BATTERY_LOW"/> <action android:name="android.intent.action.ACTION_BATTERY_OKAY"/> </intent-filter> </receiver>

Otras acciones que quizás desee controlar incluyen: ACTION_BATTERY_CHANGED , ACTION_POWER_CONNECTED , ACTION_POWER_DISCONNECTED