¿Por qué no puedo encontrar una referencia a la clase StatusBarManager directamente?

Para arrastrar dinámicamente hacia abajo el área de notificación en Android, la única solución es esta

    Object sbservice = getSystemService( "statusbar" );
    Class<?> statusbarManager = Class.forName( "android.app.StatusBarManager" );
    Method showsb = statusbarManager.getMethod( "expand" );
    showsb.invoke( sbservice );

Esto funciona maravillosamente, pero ¿por qué la maldad con la reflexión? ¿Por qué no puedo encontrar una referencia a la clase StatusBarManager directamente? ¿Por qué no hay una constante en la clase Contexto para el servicio "barra de estado"?

preguntado el 04 de julio de 12 a las 07:07

2 Respuestas

¿Por qué la maldad con la reflexión?

Porque no es parte del SDK de Android. Solo las personas interesadas en crear aplicaciones poco confiables intentarían interactuar con el StatusBarManager fuera del código fuente de Android en sí, ya que el equipo central de Android y los fabricantes de dispositivos pueden cambiar cualquier cosa fuera del SDK cuando lo deseen.

¿Por qué no puedo encontrar una referencia a la clase StatusBarManager directamente?

Porque no es parte del SDK de Android. Hay una gran cantidad de clases y métodos en las clases del marco de trabajo de Android que están marcados con el @hide anotación, por todo tipo de razones: falta de voluntad para comprometerse a admitir la API de forma indefinida, "seguridad por oscuridad", etc.

¿Por qué no hay una constante en la clase Contexto para el servicio "barra de estado"?

Porque no es parte del SDK de Android. Sin duda, le invitamos a proporcionar parches a la AOSP para tener StatusBarManager ser "promovido" al mismo estado que los otros servicios del sistema (por ejemplo, LocationManager, NotificationManager) Si el StatusBarManager La situación es simplemente un descuido después de que se creó el SDK en ~ 2007, sus parches podrían ser aceptados y vería el cambio en una próxima versión de Android.

Respondido 04 Jul 12, 12:07

Para aquellos que esperan usar esta API directamente con su aplicación de sistema (como yo), hay una manera de obtener acceso sin reflexión.

Agregue esto a su aplicación Android.mk:

LOCAL_CERTIFICATE := platform
LOCAL_PRIVILEGED_MODULE := true

Respondido 05 Oct 18, 23:10

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.