El surgimiento de View compatible con Android

Recientemente, estoy trabajando en un efecto anti-trampas en el lado del componente de reproducción.Al reproducir, se juzga si el anuncio está parcial o completamente bloqueado.

El soporte más importante es Window, y la forma real de expresión es View, por lo que el enfoque está en la idea de monitorear la creación de Window y View.

En la actualidad, hay tres soluciones en total:
① Supervisar la creación de View:
percibir la creación de View configurando factory2 para LayoutInflater:

LayoutInflater.from(context).setFactory2()

Cuando LayoutInflater llama a createViewFromTag:

 View view;
  	 if (mFactory2 != null) {
  	     view = mFactory2.onCreateView(parent, name, context, attrs);
  	 } else if (mFactory != null) {
  	     view = mFactory.onCreateView(name, context, attrs);
  	 } else {
  	     view = null;
  	 }

Puede ser percibido por el método de interfaz set factory2 onCreateView.
La desventaja es que la escena es limitada y solo se puede percibir cuando el xml debe analizarse para generar una Vista, y la nueva Vista directa no funcionará.

② Supervise la creación de la ventana :
Crear ventana de la siguiente manera:

Window w = PolicyManager.makeNewWindow(mContext);
#PolicyManager
public static Window makeNewWindow(Context context) {
    return sPolicy.makeNewWindow(context);
}

Y esta spolicy es un objeto de interfaz estática
IPolicy final estática privada sPolicy;
la implementación es com.android.internal.policy.impl.Policy
para que podamos conectar este objeto sPolicy y percibir el tiempo de makeNewWindow.
Desventaja: en la versión superior, PolicyManager no se utiliza para crear la ventana y el código correspondiente cambia directamente a la nueva PhoneWindow()

③Escuche el método WindowManager.addView :
el objeto de proxy local del servicio WindowManagerService en la aplicación es WindowMangerImpl, que se basa en el objeto WindowManagerGlobal. Es un singleton, pero no es una interfaz, por lo que no puede ser enganchado por un proxy dinámico. . La ventaja de conectar WindowManagerGlobal es que tiene una gran compatibilidad.Esta clase apenas se ha modificado de la versión baja a la versión alta.

En WindowManagerGlobal hay varios:

private final ArrayList<View> mViews = new ArrayList<View>();
private final ArrayList<ViewRootImpl> mRoots = new ArrayList<ViewRootImpl>();
private final ArrayList<WindowManager.LayoutParams> mParams =
        new ArrayList<WindowManager.LayoutParams>();

Harán operaciones cuando llamen a addView, removeView y updateView, por lo que la apariencia de addView también se puede percibir conectando estas colecciones: escriba un ObserverList que herede ArrayList, anule el método de agregar y reemplácelo nuevamente.

Otro punto clave es que necesita conocer la posición de la Vista agregada en la pantalla. Puede obtener la posición de la vista en la pantalla a través del método
view.getLocationOnScreen(int[])
, y luego obtener el ancho y el alto de la vista y nuestra Vista. Superposición y relaciones jerárquicas.

④Diálogo de proceso cruzado, como una ventana emergente de bloqueo:
esto se puede juzgar en función de la bandera de MotionEvent del evento de clic para determinar si hay una oclusión:
https://stackoverflow.com/questions/44197671/detecting-android -superposiciones de pantalla-programáticamente

Supongo que te gusta

Origin blog.csdn.net/aa642531/article/details/103222096
Recomendado
Clasificación