Android 8.0 (nivel de API 26) introduce una variedad de y capacidades nuevas para usuarios y desarrolladores. En este documento, se destacan las novedades para desarrolladores.
Asegúrate de consultar también Cambios de comportamiento en Android 8.0 para obtener información sobre las áreas en las que cambia la plataforma podría afectar tus apps.
Experiencia del usuario
Modo de imagen en imagen
Pantalla en pantalla en Android 8.0
Android 8.0 (nivel de API 26) permite iniciar actividades en modo de pantalla en pantalla (PIP). El PIP es un tipo especial de modo multiventana que se usa principalmente para la reproducción de videos. El modo PIP estaba disponible originalmente para Solo para Android TV En Android 8.0, la función está disponible en otros dispositivos Android.
Cuando una actividad está en modo de PIP, se encuentra en estado de pausa, pero debe
seguir mostrando contenido. Por este motivo, debes asegurarte de que tu app
no pausa la reproducción en su onPause()
.
controlador. En cambio, debes pausar el video en onStop()
y reanudar la reproducción en onStart()
. Para obtener más información, consulta
Multiventana
Lifecycle.
Para especificar que tu actividad puede usar el modo PIP, establece
android:supportsPictureInPicture
como verdadero en el manifiesto.
(A partir de Android 8.0, PIP no requiere la
Atributo android:resizeableActivity
del manifiesto.
Sin embargo, debes establecer
android:resizeableActivity
como "true" si tu actividad admite otras
modos multiventana).
Android 8.0 (nivel de API 26) presenta un nuevo objeto, PictureInPictureParams
,
que pasas a métodos de PIP para especificar cómo debe comportarse una actividad.
cuando están en modo PIP. Este objeto especifica propiedades, como
la relación de aspecto preferida de tu actividad.
Los métodos de PIP existentes descritos en Agregar Ahora, la función pantalla en pantalla se usan en todos los dispositivos Android, no solo en Android TV. Además, Android 8.0 proporciona los siguientes métodos para brindar compatibilidad Modo PIP:
Activity.enterPictureInPictureMode(PictureInPictureParams args)
: Coloca la actividad en el modo de pantalla en pantalla. La relación de aspecto de la actividad y otros parámetros de configuración los especifica args. Si algún campo en args están vacíos, el sistema usa los valores establecidos la última vez que llamadaActivity.setPictureInPictureParams()
.La actividad especificada se coloca en una esquina de la pantalla. el resto de la pantalla se llena con la actividad anterior que estaba en pantalla. La actividad que ingresa al modo PIP entra en un estado de pausa, pero permanece empezaste. Si el usuario presiona la actividad de PIP, el sistema muestra un menú para con el que el usuario interactúe; ningún evento táctil llega a la actividad mientras está en el estado de PIP.
-
Activity.setPictureInPictureParams()
: Actualiza los ajustes de configuración de PIP de una actividad. Si la actividad es actualmente en modo de PIP, se actualiza la configuración; esto es útil si la relación de aspecto de la actividad. Si la actividad no está en modo PIP, estos parámetros de configuración se usan independientemente de laenterPictureInPictureMode()
al que llames.
Notificaciones
En Android 8.0 (nivel de API 26), rediseñamos las notificaciones a proporcionan una forma más sencilla y coherente de administrar el comportamiento de las notificaciones. y configuración. Entre esos cambios se incluye lo siguiente:
- Canales de notificación: Presentación de Android 8.0 canales de notificaciones que te permiten crear un canal que el usuario puede personalizar para cada tipo de notificación que quieras mostrar. La interfaz de usuario se refiere a los canales de notificaciones como categorías de notificación. Para saber cómo hacerlo para implementar canales de notificación, consulta Gestionar canales de notificaciones.
- Puntos de notificación: Android 8.0 incorpora compatibilidad para la visualización puntos o insignias en los íconos de selector de aplicaciones. Los puntos de notificación reflejan el Presencia de notificaciones que el usuario aún no ha descartado ni utilizado. Para obtener información sobre cómo trabajar con puntos de notificación, consulta Notificación insignias.
- Posposición: Los usuarios pueden posponer las notificaciones, lo que hace que desaparezcan. durante un tiempo antes de reaparecer. Las notificaciones vuelven a aparecer con el el mismo nivel de importancia con el que aparecieron por primera vez. Las apps pueden quitar o actualizar una notificación pospuesta, pero actualizar una notificación no causa para que vuelva a aparecer.
- Tiempos de espera de las notificaciones: Puedes establecer un tiempo de espera cuando creas una
notificación mediante
setTimeoutAfter()
Puedes usar este método para especificar el tiempo que durará una notificación debe cancelarse. Si es necesario, puedes cancelar la notificación antes de la transcurra la duración del tiempo de espera especificado. - Configuración de notificaciones: puedes llamar
setSettingsText()
para configurar el texto que aparece cuando creas un vínculo al nombre de tu aplicación configuración de notificaciones desde una notificaciónNotification.INTENT_CATEGORY_NOTIFICATION_PREFERENCES
. El sistema puede proporcionar los siguientes extras con la intención de filtrar la configuración que tu app debe mostrar a los usuarios:EXTRA_CHANNEL_ID
,NOTIFICATION_TAG
yNOTIFICATION_ID
. - Descarte de notificaciones: Los usuarios pueden descartar las notificaciones por sí mismos.
las apps pueden quitarlos de manera programática. Puedes determinar cuándo una notificación
se descarta y por qué se descarta implementando el
onNotificationRemoved()
de la ClaseNotificationListenerService
. - Colores de fondo: Puedes establecer y habilitar un color de fondo para una
notificación. Solo debes usar esta función en notificaciones para
tareas en curso que son esenciales para que un usuario las vea de un vistazo. Para
Por ejemplo, puedes establecer un color de fondo para las notificaciones relacionadas con
rutas en auto o una llamada telefónica en curso. También puedes establecer
el color de fondo deseado usando
setColor()
Hacerlo te permite usarsetColorized()
para habilitar el uso de un color de fondo para una notificación. - Estilo de mensajería: en Android 8.0, las notificaciones que usan
Visualización de la clase
MessagingStyle
más contenido en su forma contraída. Deberías usar elMessagingStyle
clase para notificaciones relacionadas con los mensajes. También puedes usar MétodoaddHistoricMessage()
para proporcionar contexto a una conversación agregando mensajes históricos a las notificaciones relacionadas con la mensajería.
![Un menú de notificaciones de presión prolongada en Android 8.0 (nivel de API 26).](https://developer.android.google.cn/static/images/about/versions/oreo/notification-long-press.png?authuser=9&hl=es)
Los usuarios pueden mantener presionados los íconos de selector de aplicaciones para ver en Android 8.0.
Autofill Framework
La creación de cuentas, el acceso y las transacciones con tarjetas de crédito llevan tiempo y son propensas a errores. Los usuarios pueden frustrarse fácilmente con las apps que requieren estos tipos de apps de tareas repetitivas.
Android 8.0 (nivel de API 26) permite completar formularios, como el acceso. tarjetas de crédito y tarjetas de crédito, gracias a la introducción de Autofill Framework. Las apps existentes y nuevas funcionan con Autofill Framework una vez que el usuario acepta autocompletar.
Puedes tomar algunas medidas para optimizar la manera en la que tu aplicación funciona con el marco. Para obtener más información, consulta Descripción general de Autofill Framework.
Fuentes descargables
Android 8.0 (nivel de API 26) y la biblioteca de compatibilidad de Android 26 te permiten solicitar fuentes de un en lugar de agrupar fuentes en el APK o dejar que el Fuentes de descarga de APK. Esta función reduce el tamaño del APK, aumenta la app tasa de éxito de instalaciones y permite que varias apps compartan la misma fuente.
Para obtener más información sobre la descarga de fuentes, consulta Fuentes para descargar:
Fuentes en XML
Android 8.0 (nivel de API 26) presenta una función nueva, Fuentes en XML, que
te permite usar fuentes como recursos. Esto significa que no es necesario agrupar las fuentes
como recursos. Las fuentes se compilan en un archivo R
y se crean automáticamente
disponible en el sistema como recurso. Luego, puedes acceder a estas fuentes con el
ayuda de un nuevo tipo de recurso, font
.
La biblioteca de compatibilidad 26 proporciona compatibilidad total con esta función en dispositivos. con la versión 14 o una posterior de la API.
Para obtener más información sobre el uso de fuentes como recursos y la recuperación de fuentes del sistema, consulta consulta Fuentes en XML.
Ajuste automático de tamaño de TextView
Android 8.0 (nivel de API 26) te permite configurar el tamaño del texto expandido o se contraen automáticamente según el tamaño de TextView. Esto significa que es mucho sea más fácil optimizar el tamaño del texto en diferentes pantallas o con contenido dinámico. Para obtener más información, sobre el ajuste automático de tamaño de TextView en Android 8.0, consulta Ajuste automático de tamaño de TextView.
Íconos adaptables
Android 8.0 (nivel de API 26) presenta íconos de selector adaptables. Los íconos adaptables admiten elementos visuales y puede mostrar distintas formas en distintos modelos de dispositivos. Para aprender a hacer lo siguiente: crear íconos adaptables, consulta la sección Íconos adaptables .
Administración de color
Los desarrolladores de apps de imágenes para Android ahora pueden aprovechar los nuevos dispositivos que tengan una pantalla compatible con una amplia gama de colores. Cómo mostrar una amplia gama imágenes, las apps deberán habilitar un parámetro en su manifiesto (por actividad) y cargar mapas de bits con un perfil de color amplio incorporado (AdobeRGB, Pro Photo RGB, DCI-P3, etcétera).
WebView API
Android 8.0 proporciona varias APIs para ayudarte a administrar
Los objetos WebView
que muestran contenido web en tu app
Estas APIs, que mejoran la estabilidad y seguridad de tu app, incluyen la
lo siguiente:
- API de versión
- Google SafeBrowsing API
- Termination Handle API
- API de Renderer Importance
Para obtener más información sobre cómo usar estas APIs, consulta Cómo administrar WebViews.
La clase WebView
ahora incluye una API de Navegación segura para mejorar la seguridad.
de la navegación web. Para obtener más información, consulta
API de Navegación segura de Google.
Fijación de combinaciones de teclas y widgets
Android 8.0 (nivel de API 26) incorpora la fijación de combinaciones de teclas en la app y widgets. En tu app, puedes crear accesos directos y widgets fijados para selectores admitidos, sujetos al permiso del usuario.
Para obtener más información, consulta la Cómo fijar accesos directos y widgets guía de funciones.
Relación de aspecto máxima de la pantalla
Android 8.0 (nivel de API 26) introduce cambios en la configuración de la relación de aspecto máxima de una app.
En primer lugar, Android 8.0 presenta maxAspectRatio, que usar para establecer la relación de aspecto máxima de tu app. Además, en Android 8.0 y versiones posteriores, la imagen de una app La relación de aspecto máxima predeterminada es la relación de aspecto nativa del dispositivo en el que se ejecuta la app.
Para obtener más información sobre cómo declarar la relación de aspecto máxima, consulta Compatibilidad con diferentes pantallas.
Compatibilidad con pantallas múltiples
A partir de Android 8.0 (nivel de API 26), la plataforma ofrece compatibilidad con varias pantallas. Si una actividad admite el modo multiventana y se está ejecutando en un dispositivo con varias pantallas, los usuarios pueden mover la actividad de una pantalla a otra. Cuando una app inicia una actividad, esta puede especificar en qué pantalla se debe ejecutar la actividad.
Nota: Si una actividad admite modo multiventana, Android 8.0 habilita automáticamente compatibilidad con varias pantallas para esa actividad. Debes probar tu app para asegurarte de que para asegurarte de que funcione correctamente en entornos multipantalla.
Solo se puede reanudar una actividad a la vez, aunque el estado la app tiene varias pantallas. La actividad con enfoque se encuentra en el estado de reanudación. todas las demás actividades visibles se pausarán, pero no se detendrán. Más información en el ciclo de vida de la actividad cuando varias actividades son visibles consulta Ventanas múltiples Lifecycle.
Cuando un usuario mueve una actividad de una pantalla a otra, el sistema Cambia el tamaño de la actividad y emite cambios en el tiempo de ejecución según sea necesario. Tu actividad puede manejar el cambio de configuración por sí mismo o permitir que el sistema destruirá el proceso que contiene tu actividad y recrearlo con el nuevo dimensiones. Para obtener más información, consulta Cómo controlar la configuración Cambios.
ActivityOptions
proporciona dos métodos nuevos para admitir
varias pantallas:
setLaunchDisplayId()
- Especifica en qué visualización se debe mostrar la actividad cuando se inicia.
getLaunchDisplayId()
- Muestra la pantalla de inicio actual de la actividad.
El shell de abd se extiende para admitir varias pantallas.
Ahora se puede usar el comando shell start
para iniciar una actividad.
y especificar la pantalla de destino de la actividad:
adb shell start <activity_name> --display <display_id>
Márgenes y relleno con diseño unificado
Android 8.0 (nivel de API 26) facilita la especificación de situaciones en las que lados opuestos
de un elemento View
usan el mismo margen o padding.
Específicamente, ahora puedes usar los siguientes atributos en tu XML de diseño
archivos:
-
layout_marginVertical
, que definelayout_marginTop
ylayout_marginBottom
al mismo tiempo. -
layout_marginHorizontal
, que definelayout_marginLeft
ylayout_marginRight
al mismo tiempo. -
paddingVertical
, que definepaddingTop
ypaddingBottom
al mismo tiempo. -
paddingHorizontal
, que definepaddingLeft
ypaddingRight
al mismo tiempo.
Nota: Si personalizas la lógica de tu app para
admitir diferentes
idiomas y culturas, incluida la dirección del texto, ten en cuenta que estos
no afectan los valores de
.
layout_marginStart
,
layout_marginEnd
,
.
paddingStart
o
.
paddingEnd
. Puedes establecer estos valores por tu cuenta, además de
los nuevos atributos de diseño vertical y horizontal para crear el comportamiento del diseño
que depende de la dirección del texto.
Captura de puntero
Algunas apps, como juegos, escritorio remoto y clientes de virtualización, al controlar el puntero del mouse. La captura del puntero es una nueva en Android 8.0 (nivel de API 26) que proporciona ese control mediante la entrega de todos los eventos del mouse a una vista enfocada en tu app.
A partir de Android 8.0, una View
en tu app puede solicitar
captura del puntero y define un objeto de escucha para procesar los eventos del puntero capturados. El
el puntero del mouse permanece oculto en este modo. La vista puede liberar la captura del puntero
cuando ya no necesita la información del mouse. El sistema también puede liberar
captura del puntero cuando la vista pierde el foco, por ejemplo, cuando el usuario abre
otra app.
Para obtener información sobre cómo usar esta función en tu app, consulta Captura de punteros.
Categorías de apps
Android 8.0 (nivel de API 26) permite que cada app declare una categoría adecuada
cuando sea relevante. Estas categorías se usan para agrupar apps de similares
propósito o función cuando se presentan a los usuarios, como en Uso de datos, Uso de batería o
Uso del almacenamiento. Puedes definir una categoría para tu aplicación estableciendo la
Atributo android:appCategory
en tu <application>
etiqueta del manifiesto.
Lanzador de Android TV
Android 8.0 (nivel de API 26) incluye una nueva app centrada en el contenido, La experiencia de la pantalla principal de Android TV, que está disponible con imagen del dispositivo del emulador de Android TV y Nexus Player para Android 8.0. La nueva pantalla principal organiza contenido de video en filas correspondientes a los canales, que se completan con programas por una aplicación en el sistema. Las apps pueden publicar varios canales, y los usuarios pueden configurar en qué canales que deseas ver en la pantalla de inicio. La pantalla principal de Android TV también incluye la fila Ver a continuación, que se completados con programas de apps, según los hábitos de visualización del usuario. Las apps también pueden brindar vistas previas de videos, que se reproducen automáticamente cuando un usuario se centra en un programa. Las APIs para los canales y programas que se propagan son parte de las APIs de TvProvider, que se distribuyen como Módulo de biblioteca de compatibilidad con Android 8.0.
AnimatorSet
A partir de Android 8.0 (nivel de API 26), la API de AnimatorSet
admite la búsqueda y el juego en
revertir. La búsqueda te permite establecer la posición de la animación configurada en un
en un momento determinado. La reproducción en orden inverso es útil si tu app incluye animaciones.
para acciones que se pueden deshacer. En lugar de definir dos animaciones separadas
puedes reproducir el mismo a la inversa.
Entrada y navegación
Clústeres de navegación con teclado
Si una actividad de tu app usa una jerarquía de vistas compleja, como la de la Figura 2: Considera organizar grupos de elementos de la IU en clústeres para que sea más fácil navegación con teclado entre ellas. Los usuarios pueden presionar Meta+Tab, o Búsqueda+Tab en Chromebook para navegar de un clúster a otro. Buenos ejemplos de grupos incluyen: paneles laterales, barras de navegación, áreas de contenido principales y elementos que podría contener muchos elementos secundarios.
![Una actividad de ejemplo que incluye cinco clústeres de navegación que el usuario
puede navegar con la combinación de teclas de clúster de navegación con teclado. Los clústeres
aparecen en la siguiente disposición: panel superior, panel lateral izquierdo, contenido principal
panel inferior y botón de acción flotante.](https://developer.android.google.cn/static/images/about/versions/oreo/keyboard-navigation-clusters.png?authuser=9&hl=es)
Para crear un elemento View
o ViewGroup
, sigue estos pasos:
un clúster, configura
android:keyboardNavigationCluster
atribuye a
true
en el archivo en formato XML de diseño del elemento o pasa true
.
en setKeyboardNavigationCluster()
en la lógica de la IU de tu app.
Nota: Los clústeres no se pueden anidar, aunque no están anidados.
pueden aparecer en diferentes niveles de la jerarquía. Si intentas
anidar clústeres, el framework solo trata a los clústeres
ViewGroup
como un clúster.
En dispositivos con pantallas táctiles, puedes establecer un clúster designado
ViewGroup
objeto
android:touchscreenBlocksFocus
elemento a true
para
permitir la navegación solo dentro y fuera del clúster. Si aplicas esto
configuración en un clúster, los usuarios no pueden usar la tecla Tab ni las teclas de flecha para
navegar dentro o fuera del clúster; deberá presionar el botón de navegación del clúster
combinación de teclas.
Foco predeterminado de las vistas
En Android 8.0 (nivel de API 26), puedes asignar el View
que debería
reciben el foco después de que se reanuda una actividad (re)creada y el usuario presiona un
tecla de navegación del teclado, como la tecla Tab. Para aplicar el enfoque “enfocado de forma predeterminada”
parámetro, establece el valor de un elemento View
el atributo android:focusedByDefault
a true
en el
archivo en formato XML de diseño que contenga el elemento de la IU o pasa true
a
setFocusedByDefault()
en tu
la lógica de la IU de la app.
Salida de voz
Las actividades y los servicios pueden usar instancias
TextToSpeech
para dictar y pronunciar el contenido. Hasta el
Android 8.0 (nivel de API 26), tu app puede obtener información más precisa sobre el tiempo
cuando un motor de texto a voz comienza a leer palabras individuales sintetizadas
siempre que el motor proporcione esa información. Puedes usar esta función
llamar la atención sobre palabras específicas a medida que el motor de texto a voz habla
de ellos.
Para usar estas mejoras del motor de texto a voz en tu app, registra un
instancia de UtteranceProgressListener
. Como parte del
de registro, debes incluir un controlador para
onRangeStart()
.
El motor de texto a voz llama
rangeStart()
para grabar
el momento en el que se espera la reproducción de audio de un rango específico de texto
para comenzar. Cuando comience la reproducción del audio de ese intervalo de texto, la
onRangeStart()
se ejecutan correctamente. Luego, tu app puede responder a esta devolución de llamada, por ejemplo,
destacando el rango de texto asociado con el enunciado.
Para obtener más información sobre el seguimiento del progreso de reproducción de texto a voz
consulta la clase UtteranceProgressListener
referencia.
Sistema
Nuevos detectores StrictMode
Android 8.0 (nivel de API 26) agrega tres detectores StrictMode nuevos para ayudar a identificar posibles errores en tu app:
detectUnbufferedIo()
detectará cuándo tu app lee o escribe datos sin almacenamiento en búfer, lo que puede afectar drásticamente rendimiento.detectContentUriWithoutPermission()
hará lo siguiente detectar si tu app accidentalmente olvida otorgar permisos a otra app cuando iniciar una actividad fuera de tu app.detectUntaggedSockets()
detectará cuándo tu app realiza tráfico de red sin usarsetThreadStatsTag(int)
a fin de etiquetar tu tráfico para la depuración comerciales.
Datos almacenados en caché
Android 8.0 (nivel de API 26) brinda una mejor orientación y mejores comportamientos en torno a los datos almacenados en caché. Cada
Ahora, la app recibe una cuota de espacio en disco para los datos almacenados en caché, como lo muestra
getCacheQuotaBytes(UUID)
Cuando el sistema necesite liberar espacio en el disco, comenzará a borrar los archivos almacenados en caché de las apps que superan en máximo su cuota asignada. Por lo tanto, si mantienes los datos almacenados en caché cuota asignada, tus archivos almacenados en caché serán los últimos del sistema en eliminarse cuando necesario. Cuando el sistema decida qué archivos almacenados en caché eliminar en tu app, considera primero los archivos más antiguos (según lo determinado por la hora de modificación).
También hay dos comportamientos nuevos que puedes habilitar por directorio para controlar cómo el sistema libera tus datos almacenados en caché:
StorageManager.setCacheBehaviorAtomic()
se puede usar para indicar que un directorio y todo su contenido se deberían borrar como una sola unidad atómica.setCacheBehaviorTombstone(File, boolean)
se puede usar para indicar que, en lugar de borrar archivos de un directorio, se trunquen a 0 bytes en del archivo, lo que deja intacto el archivo vacío.
Por último, cuando necesites asignar espacio en disco para archivos grandes, considera usar el nuevo
API de allocateBytes(FileDescriptor, long)
, que borrará automáticamente
los archivos almacenados en caché que pertenecen a otras aplicaciones (según sea necesario) para cumplir con su solicitud. Al decidir si los
dispositivo tenga espacio suficiente en el disco para guardar tus datos nuevos, llama
getAllocatableBytes(UUID)
en lugar de usar
getUsableSpace()
, ya que el primero considerará cualquier almacenamiento
que el sistema está dispuesto a borrar en tu nombre.
Paginación de proveedores de contenido
Actualizamos los proveedores de contenido para que admitan la carga de un conjunto de datos, una página a la vez. Por ejemplo, una aplicación de fotos con miles de las imágenes pueden consultar un subconjunto de datos para presentar en una página. Cada página de los resultados que muestra un proveedor de contenido se representa con un solo cursor . Tanto un cliente como un proveedor deben implementar paginación para usar esta función.
Para obtener información detallada sobre los cambios en los proveedores de contenido, consulta
ContentProvider
y
ContentProviderClient
Solicitudes de actualización de contenido
Los operadores ContentProvider
y
Ahora cada clase ContentResolver
incluye un
refresh()
, lo que permite a los clientes saber con mayor facilidad si
esté actualizada la información solicitada.
Puedes agregar lógica de actualización de contenido personalizada extendiendo
ContentProvider
Asegúrate de anular el
Método refresh()
para mostrar
true
, que les indica a los clientes de su proveedor que intentó
para actualizar los datos por tu cuenta.
Tu app cliente puede solicitar de forma explícita contenido actualizado llamando a un
otro método, también llamado
refresh()
Cuando lo llames
pasa el URI de los datos que se actualizarán.
Nota: Como es posible que solicites datos a través de una red,
deberías invocar a refresh()
desde
el cliente solo cuando haya indicios concretos de que el contenido es obsoleto.
El motivo más común para actualizar el contenido de este tipo es en respuesta a
la opción de deslizar para actualizar
para solicitar explícitamente que la IU actual muestre contenido actualizado.
Mejoras de JobScheduler
Android 8.0 (nivel de API 26) presenta varias mejoras para JobScheduler
. Estas mejoras facilitan el uso de tu app
para cumplir con la nueva antecedente
y límites de ejecución, ya que, por lo general, puedes usar trabajos programados para reemplazar
servicios en segundo plano o receptores de transmisiones implícitas ahora restringidos.
Entre las actualizaciones de JobScheduler
, se incluyen las siguientes:
-
Ahora puedes asociar una cola de trabajo con un trabajo programado. Para agregar un elemento de trabajo a
la cola de un trabajo, llamar
JobScheduler.enqueue()
Cuando la tarea se encuentra en ejecución, puede tomar trabajo pendiente de la cola y procesarlo. Esta funcionalidad maneja muchos de los casos de uso que anteriormente habrían se recurrió al inicio de un servicio en segundo plano, en particular, aquellos que implementanIntentService
-
En Android
La biblioteca de compatibilidad 26.0.0 presenta una nueva clase
JobIntentService
, que proporciona lo mismo funcionalidad comoIntentService
, pero usa trabajos en lugar de servicios cuando se ejecuta en Android 8.0 (nivel de API 26) o versiones posteriores. -
Ya puedes llamar
JobInfo.Builder.setClipData()
para asociar unClipData
con un trabajo. Esta opción permite asociar otorgamientos de permisos de URI con un trabajo, de manera similar a como estos los permisos se pueden propagar aContext.startService()
. También puedes usar otorgamientos de permisos de URI con intents en las colas de trabajo. -
Los trabajos programados ahora admiten varias restricciones nuevas:
JobInfo.isRequireStorageNotLow()
- El trabajo no se ejecuta si el almacenamiento disponible del dispositivo es bajo.
JobInfo.isRequireBatteryNotLow()
- El trabajo no se ejecuta si el nivel de la batería es igual o inferior al nivel crítico umbral; este es el nivel en el que el dispositivo muestra el estado de Batería baja Advertencia del sistema.
NETWORK_TYPE_METERED
- El trabajo requiere una conexión de red de uso medido, como la mayoría de los datos móviles. de los planes de negocios de los socios.
Almacén de datos personalizados
Android 8.0 (nivel de API 26) te permite proporcionar un almacén de datos personalizado para tus preferencias, que puede ser útil si tu app almacena las preferencias en una base de datos local o en la nube. si las preferencias son específicas del dispositivo. Para obtener más información para implementar el almacén de datos, consulta Almacén de datos personalizados.
Mejoras de medios
VolumeShaper
Hay una clase VolumeShaper
nueva. Usa
para realizar transiciones de volumen automatizadas breves, como fundido de entrada, fundido de salida y fundido cruzado.
Consulta Cómo controlar la amplitud con VolumeShaper
para obtener más información.
Mejoras en el foco de audio
Las apps de audio comparten la salida de audio en un dispositivo solicitando y abandonando el foco del audio.
Una app maneja los cambios en el foco iniciando o deteniendo la reproducción, o atenuando su volumen.
Hay una clase AudioFocusRequest
nueva. Usar esta clase como parámetro de
requestAudioFocus()
,
Las apps tienen nuevas capacidades a la hora de controlar cambios en el foco de audio:
disminución automática de volumen y
obtención demorada del foco.
Métricas de medios
Un nuevo método getMetrics()
muestra un PersistableBundle
.
objeto que contiene la configuración
y de rendimiento, expresada como un mapa de atributos y valores.
El método getMetrics()
se define para estas clases de contenido multimedia:
MediaPlayer.getMetrics()
MediaRecorder.getMetrics()
MediaCodec.getMetrics()
MediaExtractor.getMetrics()
Las métricas se recopilan por separado para cada instancia y se conservan durante la vida útil de la instancia. Si no hay métricas disponibles, el método devuelve null. Las métricas reales que se muestran dependen de la clase.
MediaPlayer
A partir de Android 8.0 (nivel de API 26), MediaPlayer puede reproducir contenido. Protegido por DRM y medios encriptados a nivel de muestra HLS.
Android 8.0 introduce un nuevo software
seekTo()
que proporciona un control detallado
cuando busques un fotograma. Incluye un segundo parámetro que especifica un modo de búsqueda:
SEEK_PREVIOUS_SYNC
mueve la posición del contenido multimedia a un fotograma de sincronización (o de teclas). asociados con una fuente de datos que se encuentra justo antes o en un momento determinado.SEEK_NEXT_SYNC
mueve la posición del contenido multimedia a un fotograma de sincronización (o de teclas) asociado. con una fuente de datos que se encuentra inmediatamente después o en el momento dado.SEEK_CLOSEST_SYNC
mueve la posición del contenido multimedia a un fotograma de sincronización (o de teclas). asociados con una fuente de datos que se encuentra más cerca o en un momento determinado.SEEK_CLOSEST
mueve la posición del contenido multimedia a un fotograma (no es necesariamente una sincronización). o fotograma clave) asociados con una fuente de datos que se encuentra más cerca en un momento dado.
Cuando se realiza una búsqueda continua, las apps deben usar cualquiera de los modos SEEK_
en lugar de SEEK_CLOSEST
, que se ejecuta relativamente más lento, pero puede ser más preciso.
MediaRecorder
- MediaRecorder ahora admite el formato MPEG2_TS, que es útil para
transmitiendo:
Kotlin
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS)
Java
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS);
consulta
MediaRecorder.OutputFormat
- El
MediaMuxer
ahora puede manejar cualquier cantidad de transmisiones de audio y video. Ya no estás limitado a una pista de audio o una pista de video. UsaaddTrack()
para mezclar tantas pistas como quieras. - El
MediaMuxer
también puede agregar una o más pistas de metadatos que contengan por fotograma definido por el usuario información. Tu aplicación es la que define el formato de los metadatos. El la pista de metadatos solo es compatible con contenedores MP4.
Los metadatos pueden ser útiles para el procesamiento sin conexión. Por ejemplo, las señales giroscópicas de el sensor se podría usar para la estabilización de video.
Cuando se agrega una pista de metadatos, el formato MIME de la pista debe comenzar con el prefijo
“application/”. Escribir metadatos es lo mismo que escribir datos de video y audio, excepto
que los datos no provienen de una MediaCodec
. En cambio, la app pasa una
ByteBuffer
por una marca de tiempo asociada al
writeSampleData()
.
La marca de tiempo tiene que estar en la misma base de tiempo que las pistas de video y audio.
El archivo MP4 generado usa el TextMetaDataSampleEntry
definido en la sección
12.3.3.2 de la ISOBMFF para indicar el formato MIME de los metadatos Cuando se usa MediaExtractor
para extraer el archivo con la pista de metadatos, el MIME
formato de los metadatos se extraerá en MediaFormat
.
Acceso mejorado a archivos multimedia
El
El framework de acceso al almacenamiento (SAF) permite que las apps expongan una red
DocumentsProvider
, que puede proporcionar acceso a los archivos
de una fuente de datos a otras apps. De hecho, un
proveedor de documentos incluso puede brindar acceso a archivos
que residen en el almacenamiento de red o que usan un protocolo como
Protocolo de transferencia multimedia (MTP).
Sin embargo, el acceso a grandes archivos multimedia desde una fuente de datos remota presenta algunas desafíos:
- Los reproductores multimedia requieren acceso que admita búsquedas para un archivo a través de un proveedor de documentos. Cuando un archivo multimedia grande reside en una fuente de datos remota, el el proveedor de documentos debe recuperar todos los datos con anticipación y crear una instantánea descriptor de archivos. El reproductor multimedia no puede reproducir el archivo sin él descriptor, por lo que la reproducción no podrá comenzar hasta que finalice el proveedor de documentos descargando el archivo.
- Los administradores de colecciones multimedia, como las apps de fotos, deben recorrer una serie de acceder a URI para llegar al contenido multimedia almacenado en una tarjeta SD externa mediante individuales. Este patrón de acceso realiza operaciones masivas en los medios, como mover, copiar y borrar, bastante lento.
- Los administradores de colecciones multimedia no pueden determinar la ubicación de un documento debido a su URI Esto dificulta que estos tipos de apps les permitan a los usuarios elegir dónde guardar un archivo multimedia.
Android 8.0 aborda cada uno de estos desafíos mejorando el acceso al almacenamiento de Google Cloud.
Proveedores de documentos personalizados
A partir de Android 8.0, el framework de acceso al almacenamiento permite documentos personalizados proveedores para crear descriptores de archivos que admitan búsquedas para los archivos que se alojen en una una fuente de datos remota. El SAF puede abrir un archivo para obtener un archivo nativo que admita búsquedas. descriptor de la aplicación. Luego, el SAF entrega solicitudes de bytes discretas a los documentos. proveedor. Esta función permite que un proveedor de documentos devuelva el rango exacto de bytes que solicitó una app de reproducción multimedia, en lugar de almacenar en caché toda la que se puede enviar un archivo con anticipación.
Para usar esta función, debes llamar al nuevo
StorageManager.openProxyFileDescriptor()
. El
El método openProxyFileDescriptor()
acepta un objeto ProxyFileDescriptorCallback
como devolución de llamada. El SAF invoca
la devolución de llamada cada vez que una aplicación cliente realice operaciones de archivo en la
descriptor de archivo que muestra el proveedor de documentos.
Acceso directo a documentos
A partir de Android 8.0 (nivel de API 26), puedes usar la
getDocumentUri()
para
Obtén un URI que hace referencia al mismo documento que el objeto mediaUri
especificado.
Sin embargo, debido a que el URI devuelto está respaldado por un
DocumentsProvider
, los administradores de colecciones multimedia pueden acceder
el documento directamente, sin tener que recorrer árboles de directorios determinados.
Como resultado, los administradores de medios pueden realizar operaciones relacionadas con archivos en el documento.
mucho más rápido.
Precaución: El método getDocumentUri()
solo busca archivos multimedia. no otorga permiso a las apps
permiso para acceder a esos archivos. Si deseas obtener más información para obtener acceso
permiso para acceder a los archivos multimedia, consulta la documentación de referencia.
Rutas de acceso a los documentos
Cuando usas el framework de acceso al almacenamiento en Android 8.0 (nivel de API 26), puedes usar la
Método findDocumentPath()
, disponible en ambos
la DocumentsContract
y
DocumentsProvider
para determinar la ruta desde la raíz de un sistema de archivos según la carga
ID. El método devuelve la ruta de acceso en un
DocumentsContract.Path
. En los casos en que un archivo
sistema tiene varias rutas definidas para el mismo documento, el método devuelve
la ruta de acceso que se usa con mayor frecuencia para llegar al documento con el ID determinado.
Esta funcionalidad es especialmente útil en las siguientes situaciones:
- Tu app usa la función "Guardar como" que muestra la ubicación de una documento en particular.
- Tu app muestra carpetas en una vista de resultados de búsqueda y debe cargar el elemento secundario documentos que se encuentran dentro de una carpeta en particular si el usuario selecciona que carpeta.
Nota: Si tu app tiene permiso para acceder solo a algunos documentos
en la ruta, el valor que se muestra de findDocumentPath()
solo incluye
las carpetas y los documentos a los que puede acceder tu aplicación.
Cómo supervisar la reproducción de audio
El servicio del sistema AudioManager
mantiene una lista de
objetos AudioPlaybackConfiguration
activos, cada uno de los cuales
contiene información sobre una sesión de reproducción de audio en particular. Tu app puede hacer lo siguiente:
recuperar el conjunto de parámetros de configuración activos actualmente llamando
getActivePlaybackConfigurations()
A partir de Android 8.0 (nivel de API 26), puedes registrar una devolución de llamada que notifique
tu app cuando una o más
AudioPlaybackConfiguration
objetos cambiaron. Para ello, sigue estos pasos:
llamar a registerAudioPlaybackCallback()
y pasar una instancia de
AudioManager.AudioPlaybackCallback
El
La clase AudioManager.AudioPlaybackCallback
contiene las
onPlaybackConfigChanged()
al que llama el sistema cuando el audio
cambios en la configuración de reproducción
Conectividad
Reconocimiento de Wi-Fi
Android 8.0 (nivel de API 26) incorpora compatibilidad con reconocimiento de Wi-Fi, que se basa en la función Neighbor Especificación de Awareness Networking (NAN). En dispositivos con las funciones El hardware de reconocimiento de Wi-Fi, las apps y los dispositivos cercanos pueden descubrir y comunicarse a través de Wi-Fi sin un punto de acceso a Internet. Estamos trabajando con nuestro hardware y socios llevar la tecnología de reconocimiento de Wi-Fi a los dispositivos lo antes posible. Para para obtener información sobre cómo integrar el reconocimiento de Wi-Fi a tu app, consulta Reconocimiento de Wi-Fi.
Bluetooth
Android 8.0 (nivel de API 26) enriquece la compatibilidad de la plataforma con Bluetooth agregando lo siguiente atributos:
- Compatibilidad con AVRCP 1.4 estándar, lo que permite explorar la biblioteca de canciones.
- Compatibilidad con Bluetooth Low-Energy (BLE) 5.0 estándar.
- Integración del códec de Sony LDAC a la pila Bluetooth.
Sincronización de dispositivos complementarios
Android 8.0 (nivel de API 26) proporciona APIs que te permiten personalizar la Diálogo de solicitud de vinculación cuando se intenta vincular con dispositivos complementarios Bluetooth, BLE y Wi-Fi Para obtener más información, consulta Dispositivo complementario Vinculación.
Para obtener más información sobre el uso de Bluetooth en Android, consulta la Bluetooth. Para cambios específicos de Bluetooth para Android 8.0 (nivel de API 26), consulta el sección Bluetooth de la Página Cambios de comportamiento en Android 8.0
Uso compartido
Uso compartido inteligente
Android 8.0 (nivel de API 26) aprende sobre las capacidades uso compartido personalizado preferencias y a comprender mejor cada tipo de contenido, cuáles son para compartir. Por ejemplo, si un usuario toma una foto de un recibo, Android 8.0 puede sugerir una aplicación de seguimiento de gastos. Si el usuario se toma una selfie, cómo la app puede manejar mejor la imagen. Android 8.0 aprende automáticamente todo esto de patrones de acuerdo con las métricas preferencias personalizadas.
El uso compartido inteligente funciona para los tipos de contenido que no sean image
, como
audio
, video
, text
y URL
,
etcétera
Para habilitar el uso compartido inteligente, agrega un ArrayList
de hasta tres
de cadenas de texto al intent que comparte el contenido. Las anotaciones deben
describen los componentes o temas principales del contenido. El siguiente ejemplo de código
se muestra cómo agregar anotaciones al intent:
Kotlin
val annotations: ArrayList<String> = arrayListOf( "topic1", "topic2", "topic3" ) intent.putStringArrayListExtra( Intent.EXTRA_CONTENT_ANNOTATIONS, annotations )
Java
ArrayList<String> annotations = new ArrayList<>(); annotations.add("topic1"); annotations.add("topic2"); annotations.add("topic3"); intent.putStringArrayListExtra( Intent.EXTRA_CONTENT_ANNOTATIONS, annotations );
Para obtener información detallada sobre las anotaciones de uso compartido inteligente, consulta
EXTRA_CONTENT_ANNOTATIONS
Clasificador de texto
En dispositivos compatibles, las apps pueden usar un nuevo clasificador de texto para verificar si se
string coincide con un tipo de entidad clasificador conocido y obtiene una selección sugerida
alternativas. Las entidades reconocidas por el sistema incluyen direcciones, URLs,
números de teléfono y direcciones de correo electrónico. Para obtener más información, consulta
TextClassifier
Accesibilidad
Android 8.0 (nivel de API 26) admite varias funciones de accesibilidad nuevas para desarrolladores que crean sus propios servicios de accesibilidad:
- Una nueva categoría de volumen para ajustar accesibilidad Volumen.
- Huella digital gestos como un mecanismo de entrada.
- Multilingüe de texto a voz.
- Un enfoque de accesibilidad de accesibilidad para acceder rápidamente a un servicio de accesibilidad preferido.
- Compatibilidad con continuación como los gestos o las secuencias programáticas de trazos.
- Los accesibilidad botón para invocar una de las varias funciones de accesibilidad habilitadas (disponible solo en los dispositivos que usan un área de navegación renderizada por software).
- Estandarización valores de rango unilaterales.
- Varias funciones para procesando texto más fácilmente, incluidos el texto de las sugerencias y las ubicaciones del texto en pantalla caracteres.
Seguridad y privacidad
Permisos
Android 8.0 (nivel de API 26) presenta varios permisos nuevos relacionados con la telefonía:
- El
El permiso
ANSWER_PHONE_CALLS
permite que tu app responda llamadas telefónicas entrantes de forma programática. Para manejar una llamada entrante en tu app, puedes usar laacceptRingingCall()
. - El
El permiso
READ_PHONE_NUMBERS
otorga a tu app acceso de lectura a los números de teléfono almacenados en un dispositivo.
Estos permisos se clasifican como
peligroso
y ambos forman parte del
PHONE
grupo de permisos.
Acceso a la cuenta nueva y las API de detección
Android 8.0 (nivel de API 26) introduce varias mejoras en relación con las apps obtienen acceso a las cuentas de usuario. En las cuentas que administra, los autenticadores pueden usar su propia política para decidir si ocultarán las cuentas, o revelar cuentas a una aplicación. El sistema Android realiza un seguimiento de las aplicaciones que pueden acceder a una cuenta determinada.
En versiones anteriores de Android, las apps que querían rastrear la lista de
las cuentas de usuario debían recibir actualizaciones de todas las cuentas, incluidas las cuentas con
tipos no relacionados. En Android 8.0, se incorpora
addOnAccountsUpdatedListener(android.accounts.OnAccountsUpdateListener, android.os.Handler, boolean, java.lang.String[])
que permite a las apps especificar una lista de tipos de cuentas
para qué cuentas se deben recibir cambios.
Cambios en la API
AccountManager proporciona seis métodos nuevos para ayudar a los autenticadores a administrar cuáles las apps pueden ver una cuenta:
setAccountVisibility(android.accounts.Account, java.lang.String, int)
: Establece el nivel de visibilidad de una cuenta de usuario y un paquete específicos. combinación.-
getAccountVisibility(android.accounts.Account, java.lang.String)
: Obtiene el nivel de visibilidad de una cuenta de usuario y un paquete específicos combinación. -
getAccountsAndVisibilityForPackage(java.lang.String, java.lang.String)
: Permite a los autenticadores obtener las cuentas y los niveles de visibilidad de un paquete determinado. -
getPackagesAndVisibilityForAccount(android.accounts.Account)
: Permite a los autenticadores obtener valores de visibilidad almacenados para una cuenta determinada. -
addAccountExplicitly(android.accounts.Account, java.lang.String, android.os.Bundle, java.util.Map<java.lang.String, java.lang.Integer>)
: Permite a los autenticadores inicializar los valores de visibilidad de una cuenta. -
addOnAccountsUpdatedListener(android.accounts.OnAccountsUpdateListener, android.os.Handler, boolean, java.lang.String[])
: Agrega un objeto de escuchaOnAccountsUpdateListener
al ObjetoAccountManager
. El sistema llama a este objeto de escucha cada vez que cambia la lista de cuentas del dispositivo.
Android 8.0 (nivel de API 26) incluye dos valores de nombre de paquete especiales para especificar la visibilidad
para las aplicaciones que no se establecieron con el
setAccountVisibility(android.accounts.Account, java.lang.String, int)
. El
PACKAGE_NAME_KEY_LEGACY_VISIBLE
el valor de visibilidad se aplica a las apps que tienen la
GET_ACCOUNTS
permiso y versiones de destino
Un dispositivo Android anterior a Android 8.0 o una versión
coinciden con el autenticador dirigido a cualquier versión de Android.
PACKAGE_NAME_KEY_LEGACY_NOT_VISIBLE
proporciona un valor de visibilidad predeterminado para
que no se configuraron y para las que
PACKAGE_NAME_KEY_LEGACY_VISIBLE
no es
que corresponda.
Para obtener más información sobre el acceso a la cuenta nueva y las APIs de descubrimiento, consulta la
referencia para
AccountManager
y
OnAccountsUpdateListener
Prueba
Pruebas de instrumentación
Android 8.0 (nivel de API 26) proporciona los siguientes elementos de compatibilidad adicional para las aplicaciones y pruebas de instrumentación.
Ejecución en procesos de apps no predeterminadas
Ahora puedes especificar que se debe ejecutar una prueba de instrumentación en particular un proceso fuera del proceso predeterminado de tu app. Esta configuración es útil si tu app contiene varias actividades que se ejecutan en procesos diferentes.
Para definir la instrumentación de un proceso no predeterminado, navega a tu manifiesto
y, luego, al nivel deseado
elemento <instrumentation>
. Agrega el
android:targetProcess
y establecer su valor en uno de
lo siguiente:
- el nombre de un proceso en particular;
- una lista de nombres de procesos separados por comas;
- Un comodín (
"*"
), que permite que se ejecute la instrumentación contra cualquier proceso iniciado que ejecute código en el paquete especificado en el atributoandroid:targetPackage
.
Mientras se ejecuta la prueba de instrumentación, puedes verificar qué procesos
que está realizando la prueba llamando a getProcessName()
.
Informar resultados durante una prueba
Ahora puedes informar resultados mientras se ejecuta tu prueba de instrumentación.
en lugar de después, llamando a addResults()
.
Intents falsos para pruebas
Para facilitar la creación de pruebas de IU independientes y aisladas para las aplicaciones
actividades, Android 8.0 (nivel de API 26) presenta el
onStartActivity()
. Anula este método en una subclase personalizada del
Instrumentation.ActivityMonitor
para manejar una clase en particular
que tu clase de prueba invoca.
Cuando la clase de prueba invoca el intent, el método muestra un stub
Instrumentation.ActivityResult
en lugar de ejecutarlo
el intent en sí. Si usas esta lógica de intent ficticio en tus pruebas, puedes enfocarte
sobre cómo tu actividad prepara y maneja la intent que pasas a una
a una actividad diferente o a una app completamente diferente.
Tiempo de ejecución y Herramientas
Optimizaciones de plataforma
Android 8.0 (nivel de API 26) incorpora optimizaciones de tiempo de ejecución y otras optimizaciones a la plataforma que se traducen en una serie de mejoras en el rendimiento. Estas optimizaciones incluyen la recolección de elementos no utilizados de compactación simultánea un uso más eficiente de la memoria y la localidad del código.
Estas optimizaciones generan tiempos de inicio más rápidos y un mejor rendimiento tanto en SO y apps.
Se actualizó la compatibilidad con el lenguaje Java.
Android 8.0 (nivel de API 26) incorpora compatibilidad con varias API de Java de OpenJDK adicionales:
java.time
de OpenJDK 8.java.nio.file
yjava.lang.invoke
de OpenJDK 7.
Para obtener más información sobre las clases y los métodos en estos , consulta la documentación de referencia de la API.
Si deseas usar funciones del lenguaje Java 8 en Android Studio, deberías descarga la versión preliminar más reciente.
API actualizadas del marco de trabajo ICU4J de Android
Android 8.0 (nivel de API 26) extiende el
Framework de ICU4J para Android
APIs (un subconjunto de las APIs de ICU4J) para que los desarrolladores de apps
usar en el paquete android.icu
. Estas APIs usan datos de localización
presentes en el dispositivo, de modo que puedas reducir la huella del APK al no compilar la
ICU4J en tu APK.
Tabla 1: Versiones de ICU, CLDR y Unicode usadas en Android.
Nivel de Android API | Versión de ICU | Versión de CLDR | Versión Unicode |
---|---|---|---|
Android 7.0 (nivel de API 24), Android 7.1 (nivel de API 25) | 56 | 28 | 8.0 |
Android 8.0 (nivel de API 26) | 58.2 | 30.0.3 | 9.0 |
Para obtener más información sobre la internacionalización en Android, puedes consultar las siguientes secciones: Compatibilidad con ICU4J, consulta Internacionalización en Android.
Android para empresas
Se introdujeron nuevas funciones y APIs empresariales para los dispositivos que ejecutan Android 8.0 (nivel de API 26) Entre los aspectos destacados, se incluyen los siguientes:
- Los perfiles de trabajo en dispositivos completamente administrados permiten que las empresas separen el trabajo del datos personales y administrar ambos.
- La delegación de API permite a los propietarios de dispositivos y perfiles asignar la app la administración a otras aplicaciones.
- Mejoras en la experiencia del usuario en el flujo de aprovisionamiento (incluidas las mejoras opciones de personalización) reducen el tiempo de configuración.
- Los nuevos controles de Bluetooth, Wi-Fi, copias de seguridad y seguridad permiten que las empresas administrar más aspectos del dispositivo. Los registros de actividad de red ayudan a las empresas a hacer un seguimiento problemas.
Para obtener más información sobre estas y otras APIs y funciones nuevas de Android Enterprise, consulta Android en empresas.