|     Inicio    |   |         |  |   FOROS      |  |      |      
   Elastix - VoIP B4A (Basic4Android) App inventor 2 PHP - MySQL
  Estación meteorológica B4J (Basic4Java) ADB Shell - Android Arduino
  Raspberry Pi Visual Basic Script (VBS) FireBase (BD autoactualizable) NodeMCU como Arduino
  AutoIt (Programación) Visual Basic Cosas de Windows Webs interesantes
Translate:
Búsqueda en este sitio:


.

App inventor 2 en español
Cómo programar los teléfonos móviles con Android
mediante App inventor 2 - Juan Antonio Villalpando

-- Tutorial de iniciación de App Inventor 2 en español --

Volver al índice del tutorial

____________________________

147.- Creación de Servicios. Rush.

Servicio.aia

com.kio4.servicio.aix

servicio.zip (Source code for Rush).

- Este tutorial es la continuación de otros dos dedicados a la utilización de Rush para realizar extensiones:

- 145_extension_rush.htm

- 146_extension_archivo_rush.htm

- Vamos a crear una extensión para que una aplicación no se cierre aunque el móvil esté en estado de dormido, es decir con la pantalla apagada.

- Utilizaremos el viejo truco de mantener el funcionamiento continuo del MediaPlayer, es decir el Player ejecutará un archivo de sonido continuamente, de esta manera no se cerrará la aplicación, aunque consumirá un poco más de batería, un 3 % a la hora.

- Veremos la forma de deshabilitar el Dozemode, es decir evitaremos que la aplicación se duerma.

- También veremos Notificaciones.

________________________
2.- Bloques de la extensión.

________________________
- Diseño.

________________________
- Bloques.

________________________
-
Comentarios de la aplicación.

- Pulsamos el botón "Start" para ejecutar el servicio. Se muestra la hora de arranque y la carga de la batería.

- Mediante el Clock.Timer se va mostrando la hora y la carga actual de la batería con un TimerInterval de 950 ms.

- Se consulta la web http://worldtimeapi.org/api/timezone/Europe/Madrid y se muestra la hora desde internet.

- Con la variable s se va contado aproximadamente los segundos según el TimerInterval.

- La variable x se va incrementando, cuando llega a 10, se ejecuta una Notificación. Obtendremos el icono de una estrella en la barra de estado.

- Si pulsamos la Notificación, obtendremos en la pantalla la cuenta de la variable s. Observa el LargeIcon.

- Si pulsamos "TurnOffDozemode", se deshabilita la optimización de la batería y la aplicación podrá continuar conectándose a Internet para obtener la hora.

- Si pulsamos "Check if if is ignoring Battery Optimizations" obtenemos si está o no habilitado la optimización de la batería, es decir el Doze mode.

________________________
1.- Servicios.

- Para el código de Servicio seguiremos este tutorial:

https://www.geeksforgeeks.org/services-in-android-with-example/

- El código ejecutará continuamente el archivo de sonido: silencio.mp3, de esta forma no se cerrará la aplicación

NewService.java
				   
player = MediaPlayer.create(this, Uri.parse("file://"+ GetFileAsd("silencio.mp3")));
player.setLooping(true);
player.start();

- El archivo silencio.mp3 es un archivo de audio de un minuto de duración, pero no produce sonido, es decir es un archivo de audio que produce un sonido de silencio durante un minuto. Se ejecuta pero no suena nada.

- Si en vez de este archivo de silencio.mp3 pusieramos otro archivo de sonido real, ese archivo se ejecutaría continuamente en el MediaPlayer.

________________________
2.- Doze mode. Aplicación dormida. Optimización de la Batería.

- Al poco tiempo de presentar el móvil la pantalla negra entrará en estado de dormido, de esta manera consumirá menos energía ya que deshabilita partes de la CPU, Red, WiFi, Bluetooth,... este estado de dormido se denomina DozeMode, de esta manera la batería está optimizada y suministrará menos energía.

- https://code.briarproject.org/briar/briar/-/wikis/Android-Power-Management

- https://developer.android.com/training/monitoring-device-state/doze-standby

- Durante el Doze mode o estado dormido, el sistema se despierta en algunos momentos para comprobar si hay algún trabajo pendiente. Está despierto brevemente, realiza los trabajos pendiente y vuelve a dormir.

- En nuestra aplicación, el MediaPlayer continuaría ejecutando el archivo silencio.mp3, pero si intenta leer una página de internet obtendríamos este mensaje:

________________________
3.- Deshabilitar el Doze mode en la aplicación. Optimización de la batería.

- Podemos deshabilitar el Doze mode en nuestra aplicación, de esta manera tendremos acceso a la Red, WiFi, Bluetooth,... aunque la batería deberá suministrar más energía para alimentar a esos bloques.

- La Play de Google no admite aplicaciones que tengan deshabilitado del Doze mode.

- Este Optimizar/No optimizar de la batería lo podemos realizar manualmente en las opciones de Ajustes.

- Nuestra extensión contendrá un código para Deshabilitar el Doze mode desde la misma extensión.

- De https://stackoverflow.com/questions/37568246/how-to-turn-off-doze-mode-for-specific-apps-in-marshmallow-devices-programmatica

				   
////////////////////// TURN OFF DOZE MODE ////////////////////
@SimpleFunction(description = "Turn off doze mode.")
public void TurnOffDozeMode(){
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
Intent intent = new Intent();
String packageName = context.getPackageName();
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
if (pm.isIgnoringBatteryOptimizations(packageName)) {// if you want to disable doze mode for this package
intent.setAction(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS);
}
else { // if you want to enable doze mode
intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
intent.setData(Uri.parse("package:" + packageName));
}
context.startActivity(intent);
}
} 

________________________
4.- Consumo de la batería con el Doze mode deshabilitado.

- Con el Doze mode deshabilitado nuestra aplicación podrá trabajar con la Red, WiFi, Bluetooth,... pero consumirá más batería.

- En mi ejemplo observo que al deshabilitar el Doze mode la batería consume un 2,5 % cada hora, es decir si dejamos el móvil con la pantalla negra y con el Doze mode deshabilitado, la batería habrá perdido un 25 % de su carga en 10 horas.

- Si tenemos el móvil cargándose, conectado mediante el cable USB a nuestro cargador, el Doze mode no entra en funcionamiento, es decir no es necesario deshabilitar el Doze mode ya que el móvil no entra en modo dormido.

- Cuando el usuario conecta el dispositivo a una fuente de alimentación, el sistema libera las apps del estado inactivo lo que les permite acceder con libertar a la red y ejecutar cualquier tarea y sincronización pendiente.

________________________
5.- Creación de la extensión mediante Rush.

- En Git Bash, la barra es contraria:

../rush build

- Vamos a C:\rush\exe\servicio\src\com\kio4\servicio y copiamos los dos archivos que encontramos en esta misma página.

- Utilizaré dos archivos Servicio.java y NewService.java

________________________
6.- Comentarios del código.

- En C:\rush\exe\servicio\assets se encuentran los archivos silencio.mp3 y cara.png, este último lo utilizaremos como LargeIcon en la Notificación

- Modificamos el C:\rush\exe\servicio\rush.yml, cuidado con la indentación.

rush.yml
				   
assets:
  # Extension icon. This can be a URL or a local image in 'assets' folder.
  icon: icon.png
  # Extension assets.
  other:
     - silencio.mp3
     - cara.png

- También modificamos el C:\rush\exe\win\servicio\src\AndroidManifest.xml

- Observa que he añadido una línea para el Servicio y otra para el permiso de BATTERY_OPTIMIZATIONS.

AndroidManifest.xml
				   
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.kio4.servicio">
  <application>
    <!-- <activity android:name=".MainActivity">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity> -->
	 <!-- Mention the service name here -->
	 <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>
     <service android:name="com.kio4.servicio.NewService"/>
  </application>
</manifest>

- Cuando iniciamos el servicio, se copian los archivo silencio.mp3 y cara.png al ASD, además cara.png lo convertimos en bitmap para poder actuar como LargeIcon en la Notificación.

Servicio.java
				   
CopyFileAsset("com.kio4.servicio/silencio.mp3", GetAsdPath() + "/silencio.mp3");
CopyFileAsset("com.kio4.servicio/cara.png", GetAsdPath() + "/cara.png");
LargeIcon = BitmapFactory.decodeFile(GetAsdPath() + "/cara.png");

- Se ejecuta el Servicio en NewService.class

Intent intent = new Intent(context, NewService.class);
context.startService(intent);

NewService.java
				   
player = MediaPlayer.create(this, Uri.parse("file://"+ GetFileAsd("silencio.mp3")));
player.setLooping(true);
player.start();

- La extensión también cuenta con un bloque para comprobar si está activado el Doze mode, es decir si esta activada la Optimizacion de la Batería:

/////////////////////// CHECK BATTERY OPTIMIZATION ////////////////////////
@SimpleFunction(description = "Check if it is ignoring Battery Optimizations.")
public boolean BatteryOptimization(){

- Otro bloque para comprobar el nivel de la Batería:

///////////////////// BATERIA NIVEL ///////////////////////////////////
@SimpleFunction(description = "Battery level (percent).")
public int Battery() {

- También vamos a utilizar una Notificación. Funcionará para API 26+. Utilizaremos cara.png como LargeIcon.

- El SmallIcon será: (android.R.drawable.btn_star_big_on), podemos cambiarlo a otro: https://developer.android.com/reference/android/R.drawable.html

///////////////////////////////////////////// NOTIFY /////////////////////////////
@SimpleFunction(description = "Notify in status bar.")
public void Notify(String title, String text){

- Cuando pulsemos sobre la Notificación, se ejecutará el evento NotificationSignal, se configurará mediante un BroadcastReceiver:

////////////////////// DEVUELVE UN TEXTO CUANDO SE PULSA LA NOTIFICACION
BroadcastReceiver receiver = new BroadcastReceiver() {

 

- También he agregado un Timer, es un contador decremental. No es necesario pero lo ahí lo tenemos.

________________________
7.- Archivos.

 

Servicio.java
				   
package com.kio4.servicio;
// Juan A. Villalpando
// http://kio4.com/appinventor/147_extension_servicio_rush.htm
// https://www.geeksforgeeks.org/services-in-android-with-example/
// https://stackoverflow.com/questions/37568246/how-to-turn-off-doze-mode-for-specific-apps-in-marshmallow-devices-programmatica
// Compilado con Rush.

import com.google.appinventor.components.annotations.SimpleFunction;
import com.google.appinventor.components.annotations.SimpleEvent;
import com.google.appinventor.components.runtime.AndroidNonvisibleComponent;
import com.google.appinventor.components.runtime.ComponentContainer;
import com.google.appinventor.components.annotations.DesignerProperty;
import com.google.appinventor.components.annotations.SimpleProperty;
import com.google.appinventor.components.annotations.PropertyCategory;
import com.google.appinventor.components.common.PropertyTypeConstants;
import com.google.appinventor.components.annotations.UsesServices;
import com.google.appinventor.components.runtime.*;
import android.content.Context;
import android.content.Intent;

// BATTERY
import android.content.IntentFilter;
import android.os.BatteryManager;
import android.content.BroadcastReceiver;
// COPY FILE FROM ASSET
import java.io.FileOutputStream;
import	java.io.InputStream;
import	java.io.OutputStream;
import java.io.BufferedOutputStream;
import android.content.pm.PackageManager;
// DOZE MODE
import android.net.Uri;
import android.os.PowerManager;
import android.provider.Settings;
import android.os.Build;
// NOTIFICACION
import android.R;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.NotificationChannel;
import android.app.PendingIntent;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.NotificationCompat;
// LargeIcon Bitmap
import android.graphics.BitmapFactory;
import android.graphics.Bitmap;
// TIMER
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.TimeUnit;
import android.os.CountDownTimer;

public class Servicio extends AndroidNonvisibleComponent { 

  private ComponentContainer container;
  public static Context context;
  private String actual = "----";
  private boolean running = false;
  private CountDownTimer cTimer = null;
  
  private int nivel = 0;
  private boolean activado = false;
  private boolean IgnoringBatteryOptimization = false;
  
	private int notificationId;
	private Bitmap LargeIcon;

	private  String CHANNEL_ID = "com.kio4.notificacion";
	private static final String DEFAULT_SIGNAL = "";
	private String signal = "";

  public Servicio(ComponentContainer container) {
    super(container.$form());
    this.container = container;
    context = (Context) container.$context();
	Signal(DEFAULT_SIGNAL);	
  }
  
// Obtener el valor de la Propiedad signal. GET.
@SimpleProperty(description = "Get signal value.")
public String Signal() {return signal;}

// Establecer el valor de la Propiedad signal. SET.
@DesignerProperty(editorType = PropertyTypeConstants.PROPERTY_TYPE_STRING, defaultValue = Servicio.DEFAULT_SIGNAL + "")
@SimpleProperty(description = "Set signal value for tap notification.")
public void Signal(String nuevoSignal) {this.signal = nuevoSignal;}
	
/////////////////// START //////////////////////////////////////////  
@SimpleFunction(description = "Start Service.")
 public void Start() {	
		 if (!activado){
			 // Copia silencio.mp3 y cara.png desde el asset de la extension al ASD.
			 try {
		     CopyFileAsset("com.kio4.servicio/silencio.mp3", GetAsdPath() + "/silencio.mp3");
			 CopyFileAsset("com.kio4.servicio/cara.png", GetAsdPath() + "/cara.png");
			 LargeIcon = BitmapFactory.decodeFile(GetAsdPath() + "/cara.png");
			 } 
			 catch (Exception e) { }
			 
			 Intent intent = new Intent(context, NewService.class);
			 context.startService(intent);
			 activado = true;
			 
		////////////////////// DEVUELVE UN TEXTO CUANDO SE PULSA LA NOTIFICACION	
		BroadcastReceiver receiver = new BroadcastReceiver() {
				public void onReceive(Context context, Intent intent) {
					  if (intent.getAction().equals("action_call_method")) {
							NotificationSignal(signal); // Desde aqui va al EVENTO y devuelve signal.
					} 
				}
			};

		IntentFilter filter = new IntentFilter("action_call_method");
		context.registerReceiver(receiver, filter);	
        }
 }
 /////// EVENTO Retorno de Notificacion.
@SimpleEvent(description = "Return notificacion.")
public void NotificationSignal(String signal){
        EventDispatcher.dispatchEvent(this, "NotificationSignal", signal);
} 

/////////////////// STOP //////////////////////////////////////////   
@SimpleFunction(description = "Stop Service.")
public void Stop() {	
   Intent intent = new Intent(context, NewService.class);
   context.stopService(intent);
   activado = false;
 }  
/////////////////////////////////////////////////////////////////////////	  
// Copia archivo desde el asset al ASD.
public void CopyFileAsset(String fileName, String dest) throws Exception {
	InputStream stream = null;
	OutputStream output = null;

    stream = context.getAssets().open(fileName);
	output = new BufferedOutputStream(new FileOutputStream(dest));

    byte data[] = new byte[1024];
    int count;

    while((count = stream.read(data)) != -1)
    {  output.write(data, 0, count);  }

    output.close();
    stream.close();
 }
//////////////////////////////// GET ASD PATH ///////////
// https://www.programcreek.com/java-api-examples/?class=android.content.Context&method=getExternalFilesDir
public String GetAsdPath() {
if (!context.getExternalFilesDir(null).exists()){context.getExternalFilesDir(null).mkdirs();}   // Crea directorio files si no existiera.
return context.getExternalFilesDir(null).getAbsolutePath();
}
////////////////////// TURN OFF DOZE MODE ////////////////////
@SimpleFunction(description  = "Turn off doze mode.")
public void TurnOffDozeMode(){
   if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            Intent intent = new Intent();
            String packageName = context.getPackageName();
            PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
            if (pm.isIgnoringBatteryOptimizations(packageName)) {// if you want to disable doze mode for this package
                intent.setAction(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS);
			    }
            else { // if you want to enable doze mode
                intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
                intent.setData(Uri.parse("package:" + packageName));
            }
            context.startActivity(intent);
    }
 }
/////////////////////// CHECK BATTERY OPTIMIZATION  ///////////////////////////////////
@SimpleFunction(description  = "Check if it is ignoring Battery Optimizations.")
public boolean BatteryOptimization(){
   if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            String packageName = context.getPackageName();
            PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
            if (pm.isIgnoringBatteryOptimizations(packageName)) {IgnoringBatteryOptimization = true; }
            else {IgnoringBatteryOptimization = false;}
    }
	return IgnoringBatteryOptimization;
 }
///////////////////// BATERIA NIVEL ///////////////////////////////////
@SimpleFunction(description = "Battery level (percent).")
public int Battery() {
    IntentFilter iFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
    Intent batteryStatus = context.registerReceiver(null, iFilter);

    int level = batteryStatus != null ? batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) : -1;
    int scale = batteryStatus != null ? batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1) : -1;

    float batteryPct = level/(float) scale;

    return (int) (batteryPct * 100);
}	
///////////////////////////////////////////// NOTIFY /////////////////////////////
@SimpleFunction(description  = "Notify in status bar.")
public void Notify(String title, String text){
final Intent intentNotification = new Intent("action_call_method");
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intentNotification, PendingIntent.FLAG_UPDATE_CURRENT);

        NotificationCompat.Builder builderNotificationCompat = new NotificationCompat.Builder(context, CHANNEL_ID)
                .setContentIntent(pendingIntent)
                .setContentTitle(title)
                .setContentText(text)
                .setSmallIcon(android.R.drawable.btn_star_big_on)
				.setLargeIcon(LargeIcon)
		        .setAutoCancel(true); //  Notification will remove when tap.
			
        NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        // Create Notification Channel API 26+ 
		 if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
        NotificationChannel notificationChannel = new NotificationChannel(CHANNEL_ID, "Notificacion", NotificationManager.IMPORTANCE_DEFAULT);
        notificationManager.createNotificationChannel(notificationChannel);
		}
        notificationManager.notify(0,builderNotificationCompat.build());	
}
////////////////////////////  To Background. Minimize     //////////////////////////
// https://stackoverflow.com/questions/7530407/how-to-minimize-whole-application-in-android
@SimpleFunction(description  = "To background. Minimize this screen.")
public void ToBackground() {
Intent startMain = new Intent(Intent.ACTION_MAIN);
startMain.addCategory(Intent.CATEGORY_HOME);
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(startMain);
} 

///////////////////////////////////////////////////////////////////////////
////////////////////////////     TIMER     //////////////////////////
// Contador decremental
@SimpleFunction(description  = "Interval and tick in milliseconds.")
public void Timer(int interval, int tick) {
	CancelTimer();
    cTimer = new CountDownTimer(interval, tick) {
		
        public void onTick(long millisUntilFinished) {
			actual = Long.toString(millisUntilFinished);
			running = true;
            TimerNow(actual, running);
		}
        public void onFinish() { // Esto se realiza cuando se termina.
			running = false;
			TimerNow(actual, running); // Toque final.
        }
		
    };
    cTimer.start();
}
/////////////////////////////////////////////////////////////////////////////////////////////
// CANCELACION DEL TIMER
@SimpleFunction(description  = "Cancel Timer.")
public void CancelTimer() {
    if(cTimer!=null)
        cTimer.cancel();
}
/////////////////////// EVENTO PARA EL TIMER /////////////////////////
   @SimpleEvent(description  = "Number, is actual count of timer. Running is true or false.")
   public void TimerNow(String number, boolean running) {
    EventDispatcher.dispatchEvent(this, "TimerNow", number, running);
} 
 
} // => Fin

 

NewService.java
				   
package com.kio4.servicio;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.provider.Settings;
import androidx.annotation.Nullable;

import android.net.Uri;

public class NewService extends Service {
  
    // declaring object of MediaPlayer
    private MediaPlayer player;

    @Override
  
    // execution of service will start
    // on calling this method
    public int onStartCommand(Intent intent, int flags, int startId) {
  
        // creating a media player which
        // will play the audio of Default
        // ringtone in android device
        // player = MediaPlayer.create(this, Settings.System.DEFAULT_RINGTONE_URI );
		   player = MediaPlayer.create(this, Uri.parse("file://"+ GetFileAsd("silencio.mp3")));
  
        // providing the boolean
        // value as true to play
        // the audio on loop
           player.setLooping(true);
  
        // starting the process
           player.start();
  
        // returns the status
        // of the program
        return START_STICKY;
    }
  
    @Override
  
    // execution of the service will
    // stop on calling this method
    public void onDestroy() {
        super.onDestroy();
  
        // stopping the process
        player.stop();
    }
  
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
	
//////////////////////////////// GET PATH of silencio.mp3 ///////////
public String GetFileAsd(String NameFile) {
return Servicio.context.getExternalFilesDir(null).getAbsolutePath() + "/" + NameFile;
}	
	
}  // => Fin

________________________

________________________
2.- C
onexión con Bluetooth HC-06.

ServicioBluetooth.aia

- Mantenimiento de una conexión Bluetooth.

- Bluetooth envía continuamente números 1 2 3 4 5 6 7...

- La aplicación los recibe y los muestra.

 

bt.ino
				   
#include <SoftwareSerial.h>
SoftwareSerial BT(2,3);

int k = 0;
String kString = "0";

void setup(){
 BT.begin(9600);
 Serial.begin(9600);
}
 
void loop(){
  k = k + 1;
  Serial.println(k);
  kString = (String) k + '\n';
  BT.write(kString.c_str());
  delay(1000);
}

________________________
- Diseño.

________________________
- Bloques.

________________________

________________________
3.- Dos móviles. CloudDB.

ServicioBluetooth.aia

- Instalamos la aplicación en un móvil, lo llamaré BLACK DEVICE.

- Pulsamos en "Start", luego en "TurnOffDozemode", después en "Check if is Ignoring Battery Optimization" y en "Minimize this Screen".

- Observaremos que aproximadamente cada segundo cuenta una unidad.

- Ahora cerramos la pantalla, es decir presionamos el botón del móvil para ponerlo con pantalla negra, en estado dormido. Así lo dejamos 5...10...20 minutos.

- En otro móvil, lo llamaré WHITE DEVICE, cargamos la misma aplicación, en este podemos hacerlo con el MIT COMPANION o instalado.

- En este móvil solo pulsamos el último botón "Send random number", cada cierto tiempo pulsamos este botón.

- Al pulsar este botón se enviará un número aleatorio a CloudDB, lo recibirá esta mismo móvil y también el BLACK DEVICE, este pronunciará el número.

- Si el sistema funciona, podemos dejar el móvil BLACK DEVICE durante mucho tiempo con pantalla negra y siempre recibirá el número enviado por el WHITE DEVICE.

________________________
- Diseño.

________________________
-
Bloques.

- Recuerda estos aspectos.

- Cuando cerramos la pantalla del móvil (pantalla negra), éste entra hace una OPTIMIZACIÓN de la BATERÍA, esto se denomina Doze mode, esto es un estado de dormido, el móvil desconecta parte de la CPU, desactiva la red, restringe los broadcast,...

- Podemos evitar que una aplicación entre en DOZE mode configurándolo desde el menú de ajustes, también se puede hacer desde la misma aplicación.

- Si deshabilitamos este modo, la batería no estarán optimizada y consumirá más energía.

 

 

___________________________

 

- Mi correo:
juana1991@yahoo.com
- KIO4.COM - Política de cookies. Textos e imágenes propiedad del autor:
© Juan A. Villalpando
No se permite la copia de información ni imágenes.
Usamos cookies propias y de terceros que entre otras cosas recogen datos sobre sus hábitos de navegación y realizan análisis de uso de nuestro sitio.
Si continúa navegando consideramos que acepta su uso. Acepto    Más información