Ver Programación (8): Cómo registrar transmisiones en Vistas personalizadas
En el blog de código abierto de Android: Investigación de configuración_Cómo responden los componentes de Android a los cambios de idioma, dije que compartiría con usted cómo registrarse y recibir transmisiones en su propia Vista definida. Antes de publicar el código, echemos un vistazo a los dos métodos de devolución de llamada de View, onAttachedToWindow y onDetachedFromWindow. No es difícil ver desde la API que onAttachedToWindow y onDetachedFromWindow se devuelven cuando la vista se adjunta a la ventana y se separa de la ventana. respectivamente. El código fuente es el siguiente: /** * Esto se llama cuando la vista está adjunta a una ventana. En este punto * tiene una superficie y comenzará a dibujar. Tenga en cuenta que se garantiza que esta función * se llamará antes de {@link. #onDraw}, sin embargo, se puede llamar * en cualquier momento antes del primer onDraw, incluso antes o después de * {@link #onMeasure}. amp; REQUEST_TRANSPARENT_REGIONS) != 0) { mParent.requestTransparentRegion(this); } } /** * Esto se llama cuando la vista se separa de una ventana. En este punto, * ya no tiene una superficie para dibujar * * @. consulte #onAttachedToWindow() */ protected void onDetachedFromWindow() { if (mPendingCheckForLongPress != null) { removeCallbacks(mPendingCheckForLongPress } destroyDrawingCache() } Hay otro problema que debe aclararse, el orden de llamada del método onDraw y estos dos métodos de devolución de llamada. D/mark- (316): onAttachedToWindow() D/mark- (316): onDraw() D/mark- (316): onDetachedFromWindow() Cuando ejecutamos la aplicación y luego salimos de ella (haga clic en Atrás o cierre, no haga clic en Inicio), la secuencia de llamadas es como se muestra arriba.
Mire un ejemplo de código fuente de Android: @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); if (!mAttached) { mAttached = true; ); getContext().registerReceiver(mIntentReceiver, filter, null, getHandler()); @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow() if (mAttached) { getContext().unregisterReceiver(mIntentReceiver); = false ; } } Se puede ver que las operaciones de registrar y cancelar el registro de transmisiones se completan en dos métodos de devolución de llamada. Entre ellos, mAttached es un valor booleano definido. ¡Vale la pena aprender de este lugar! private boolean mAttached; La lógica para recibir y procesar transmisiones está aquí: Private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); Intents .SPN_STRINGS_UPDATED_ACTION.equals(action)) { updateNetworkName(intent.getBooleanExtra(Telephony.Intents.EXTRA_SHOW_SPN, false), intent.getStringExtra(Telephony.Intents.EXTRA_SPN), intent.getBooleanExtra(Telephony.Intents.EXTRA_SHOW_PLMN, false), intent . getStringExtra(Telephony.Intents.EXTRA_PLMN)); } } }; Para ver el código fuente completo, puede ver /frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/CarrierLabel.java. CarrierLabel.java es un TextView personalizado.
Como extensión, también podemos enviar transmisiones, iniciar un componente de Android, etc. en estos dos métodos de devolución de llamada. ¡Espero que te sea útil!