Red de conocimiento de recetas - Recetas de frutas - Problemas que ocurren al usar el sistema Toast

Problemas que ocurren al usar el sistema Toast

Registre los problemas que ocurren al usar el sistema Toast:

1. Los Toast de Huawei y otros teléfonos móviles no se muestran cuando el permiso de notificación está desactivado

2. puede ser diferente en diferentes teléfonos móviles;

p>

3.Problema BadTokenException de Toast;

Cuando se descubre que hay un problema con el sistema Toast, muchos estudiantes usan el cuadro de viñeta personalizado TYPE_TOAST para lograr el mismo efecto. Aunque el efecto es bueno en todos los casos, todavía hay problemas con TYPE_TOAST:

4.token null no es válido después de Android 8.0 (probado en algunos modelos);

5.Android 7.1 En el futuro, no se permitirá que se muestren dos cuadros emergentes TYPE_TOAST al mismo tiempo (prueba real en algunos modelos);

Entonces la solución es:

Creo que el ToastUtil empaquetado en los proyectos antiguos de muchos estudiantes usa directamente ApplicationContext Como contexto, luego use ToastUtil.show (str) directamente cuando necesite una ventana emergente. Esta es la forma más conveniente para que lo usemos.

Por supuesto, aún puedes usar este método de empaquetado con YToast, pero es posible que este método no muestre correctamente la ventana emergente en el siguiente escenario (el Toast nativo tampoco puede aparecer en este escenario). pero no te preocupes, no provocará que la aplicación se bloquee. La probabilidad de que ocurra este escenario es muy pequeña y se cumplen las siguientes tres condiciones necesarias:

1. De forma predeterminada, los permisos de la barra de notificaciones están todos activados).

2. Teléfonos móviles que no son MIUI

Algunos teléfonos móviles superiores a 3.3. Android8.0 (ninguno de los dispositivos 8. que probé recientemente tuvo este problema).

Pero si desea asegurarse de que la ventana emergente se pueda mostrar normalmente en todos los escenarios, se recomienda pasar Actividad como contexto cuando YToast.make (contexto), para que YToast habilite ActivityToast para mostrar en este escenario.

A continuación se presenta un análisis detallado de los cinco temas mencionados anteriormente.

Mire el método show() en el código fuente de Toast a continuación, obtenga el Innovation Manager a través de AIDL y entregue el control del siguiente proceso de visualización al servicio INotificationManager. Toast se verificará en NMS y, cuando no se pueda verificar el permiso de notificación, Toast no se mostrará.

Por supuesto, el NMS puede ser diferente en diferentes roms. Por ejemplo, MIUI ha modificado esta parte del contenido, por lo que desactivar los permisos de notificación en los teléfonos Xiaomi no hará que Toast no se pueda mostrar.

¿Cómo solucionar este problema? Siempre que se pueda omitir NotificationManagerService.

YToast implementa la función emergente global mediante TYPE_Toast y no utiliza el servicio TOAST o NMS del sistema, por lo que no está restringido por permisos de notificación.

Encontré cuatro dispositivos, creé dos Toasts con diferente gravedad y llamé al método show(). Por lo tanto, hay cuatro efectos de visualización:

La razón de este problema debería ser que la lógica de NMS que mantiene las colas Toast en las ROM de los principales fabricantes es diferente.

De manera similar, YToast también mantiene su propia lógica de cola para garantizar que el efecto de usar DToast en todos los teléfonos móviles sea el mismo.

Cuando aparecen múltiples ventanas emergentes continuamente en YToast:

Cuando las prioridades son las mismas, la anterior finaliza y la última se muestra directamente;

Si las prioridades son diferentes, si la última tiene una prioridad más alta, la primera finalizará y la segunda se mostrará directamente.

¿En qué circunstancias fallará windowToken?

El hilo de la interfaz de usuario está bloqueado, lo que provoca que TN.show() no se ejecute a tiempo. Cuando se agote el tiempo de detección del NotificationManager, el token en WMS se eliminará, lo que invalidará el token.

¿Cómo solucionarlo?

Por lo tanto, debemos hacer lo mismo con los usuarios anteriores a 8.0.

YToast realiza esta operación mediante reflexión, como se muestra a continuación:

Después de Android 8.0, WindowManager ha sido restringido y modificado, especialmente para ventanas TYPE_TOAST, se debe pasar un token para verificación.

API 25: (código fuente PhoneWindowManager.java)

API 26: (código fuente PhoneWindowManager.java)

Para resolver el primer problema, DovaToast No debe elegir omitir el control de NotificationManagerService, pero dado que el windowToken es generado por NMS, no se puede obtener un windowToken válido al omitir NMS, por lo que DovaToast como TYPE_TOAST puede caer en el cuarto problema.

Entonces, DToast elige introducir ActivityToast cuando DovaToast tiene este problema y crea una ventana emergente adjunta a Actividad para mostrar cuando DovaToast no se puede mostrar normalmente. Sin embargo, ActivityToast solo mostrará la actividad actual y no lo hace. Función de extensión de página.

Si hay una solución mejor, debe ser obtener el permiso de ventana flotante y luego cambiar a TYPE_PHONE, pero el permiso de ventana flotante a menudo no es fácil de obtener. En la actualidad, me temo que, a excepción de WeChat, otras aplicaciones no pueden garantizar los permisos de ventana flotante de los usuarios.

La estrategia de ventanas emergentes de YToast es mostrar solo una ventana emergente a la vez, lo que lógicamente evita este problema. Por lo tanto, sólo se detecta esta excepción.

Otras sugerencias

Si es aceptable que Toast no cruce interfaces, se recomienda utilizar SnackBar.