programacion - manual de android en pdf
¿Puede una vista personalizada saber que se ha llamado a onPause? (5)
Sí, puedes usar el código de abajo,
@Override
protected void onVisibilityChanged(@NonNull View changedView, int visibility) {
super.onVisibilityChanged(changedView, visibility);
if (visibility == View.VISIBLE) //onResume called
else // onPause() called
}
@Override
public void onWindowFocusChanged(boolean hasWindowFocus) {
super.onWindowFocusChanged(hasWindowFocus);
if (hasWindowFocus) //onresume() called
else // onPause() called
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
// onDestroy() called
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
// onCreate() called
}
Tengo una vista personalizada que ejecuta una operación de subproceso que se basa en realizar llamadas a las interwebs periódicamente. Me gustaría saber si hay una forma para que no tenga que eliminar ese hilo de la actividad principal (onPause) para que el hilo no se mueva en segundo plano después de que la actividad haya sido procesada (y / o eliminada).
La intención aquí es que la Vista personalizada sea autosuficiente y no necesite un manejo adicional de la Actividad. La forma de hacerlo sería que escuchara cuando su padre estaba en segundo plano y luego dejaría que el ciclo de sueño infinito en el subproceso expirara. No veo una manera de hacer eso, pero espero que esté pasando por alto algo.
No, a menos que usted lo notifique directamente.
Para su propósito, anule View.onDetachedFromWindow()
y renuncie a su Thread allí. Luego, cuando la vista vuelva a estar visible, View.onAttachedToWindow()
girar el hilo de nuevo en View.onAttachedToWindow()
. El problema con onPause () y onResume () es que todavía puede tener una vista que está visible en la pantalla, pero que se adjunta a una actividad en pausa. Un ejemplo de cuándo puede suceder esto es si tiene una Actividad en una ventana que se superpone a otra.
O, como lo sugiere william gouvea, un Fragmento podría ser más adecuado para su propósito ya que ya tiene los ganchos del ciclo de vida para pausar y reanudar, y cualquier cosa que se comunique con la red realmente cae en el ámbito del controlador de todos modos.
O bien, debe hacer saber a su vista que la Actividad propietaria ya no está en primer plano o sondear el sistema con algún método para consultar qué tarea está actualmente en primer plano, lo que parece altamente ineficiente.
Aquí hay dos enlaces que han abordado este problema:
- ¿Cómo comprobar si la actividad está en primer plano o en un fondo visible?
- Comprobando si una aplicación de Android se está ejecutando en segundo plano
(Esto podría no ser realmente una respuesta, pero era demasiado grande para un comentario)
Sí tu puedes. Todo lo que necesita es tener un campo de tipo LifecycleOwner. Más sobre esto en la documentación oficial . En mi caso, creé una vista personalizada con otra vista de la biblioteca de terceros: CameraView.
Al principio, la vista personalizada necesita implementar la interfaz LifecycleOberver
public class MakePhotoView extends ConstraintLayout implements LifecycleObserver
Entonces, tengo un campo en mi vista personalizada:
private LifecycleOwner mLifecycleOwner;
Lo paso en el constructor como uno de los parámetros:
public MakePhotoView(Context context, OnPhotoMadeListener onPhotoMadeListener, LifecycleOwner lifecycleOwner) {
super(context);
mOnPhotoMadeListener = onPhotoMadeListener;
mLifecycleOwner = lifecycleOwner;
init();
}
Después de eso, registro mi vista personalizada como observador de eventos del ciclo de vida en LifecycleOwner:
private void init() {
//other code
mLifecycleOwner.getLifecycle().addObserver(this);
}
Y finalmente puedo escuchar los eventos del ciclo de vida:
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void startCamera() {
AppLog.logObject(this, "On Resume called for MakeCameraView");
mCameraView.start();
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void stopCamera() {
AppLog.logObject(this, "On Pause called for MakeCameraView");
mCameraView.stop();
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void destroyCamera() {
AppLog.logObject(this, "On Destroy called for MakeCameraView");
mCameraView.destroy();
}
Si simplemente anula la clase de Vista y crea su propia Vista Personalizada, puede crear una interfaz para actuar como un oyente, que debe ser implementado por su actividad principal, de modo que cuando sucede algo, desencadena el evento y establece la comunicación entre esos componentes. .
Dependiendo de lo que quiera lograr, los Fragmentos podrían ser útiles ya que este componente tiene su propio ciclo de vida similar a la actividad (onPause / onResume por ejemplo), mantiene su propio estado, tiene o no una vista y puede mantener su estado entre cambios de configuración.
Vea más en: http://developer.android.com/reference/android/app/Fragment.html http://developer.android.com/guide/components/fragments.html