No estoy aquí para juzgar si es un buen patrón o no, pero si realmente se necesita una actividad que esperar para un sub-actividad, se puede intentar este enfoque:
- definir un objeto (bloqueo) sobre el cual las dos actividades se sincronizan; esto también puede (debería) funcionar como el objeto para intercambiar datos entre esas dos actividades y debe definirse como estático
- en actividad principal, iniciar una tarea asíncrona (como el hilo principal de la interfaz de usuario no puede estar en estado de espera)
- en la tarea asíncrona, inicie su subactividad
- la tarea asíncrona espera en la cerradura hasta que se notificó
- la subactividad hace lo que necesita y lo notifica al hilo de espera cuando termina
I hice algo similar en mi aplicación y en mi humilde opinión tenía una buena razón para esto (no molestarnos Con la pantalla de inicio de sesión al iniciar o reanudar la aplicación, la aplicación intenta volver a usar las credenciales almacenadas en un lugar seguro y solo en caso de que falle, muestra esta pantalla de inicio de sesión. Así que sí, básicamente cualquier actividad en mi aplicación puede "pausarse" y esperar hasta que el usuario proporcione las credenciales correctas en la actividad de inicio de sesión cuando finaliza la pantalla de inicio de sesión y la aplicación continúa exactamente donde se detuvo (en la actividad principal).
En el código sería algo como esto:
ParentActivity:
public class ParentActivity extends Activity {
private static final String TAG = ParentActivity.class.getSimpleName();
public static class Lock {
private boolean condition;
public boolean conditionMet() {
return condition;
}
public void setCondition(boolean condition) {
this.condition = condition;
}
}
public static final Lock LOCK = new Lock();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.parent_layout);
// do whatever logic you need and anytime you need to stat sub-activity
new ParentAsyncTask().execute(false);
}
private class ParentAsyncTask extends AsyncTask<Boolean, Void, Boolean> {
@Override
protected Boolean doInBackground(Boolean... params) {
// do what you need and if you decide to stop this activity and wait for the sub-activity, do this
Intent i = new Intent(ParentActivity.this, ChildActivity.class);
startActivity(i);
synchronized (LOCK) {
while (!LOCK.conditionMet()) {
try {
LOCK.wait();
} catch (InterruptedException e) {
Log.e(TAG, "Exception when waiting for condition", e);
return false;
}
}
}
return true;
}
}
}
ChildActivity:
public class ChildActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.child_layout);
// do whatever you need in child activity, but once you want to finish, do this and continue in parent activity
synchronized (ParentActivity.LOCK) {
ParentActivity.LOCK.setCondition(true);
ParentActivity.LOCK.notifyAll();
}
finish();
// if you need the stuff to run in background, use AsyncTask again, just please note that you need to
// start the async task using executeOnExecutor method as you need more executors (one is already occupied), like this:
// new ChildAsyncTask().executeOnExecutor(ChildAsyncTask.THREAD_POOL_EXECUTOR, false);
}
}
este código se compila pero subactividad no se dispara. Tengo un mensaje allí en OnCreate para iniciar sesión si se está ejecutando ChildActivity pero no hay tal entrada en el registro. No sé qué salió mal;> – questioner
intente poner ..................................... ........................ Singleton si = Singleton.getInstance(); sincronizado (si) { si.wait(); } en postDelayed (...); –
No estoy familiarizado con postDelay (r, t); pero lo leí y lo intenté, pero sin éxito, "la aplicación no responde, fuerza cerca" Creo que esperar y notificar en Android no funcionan correctamente – questioner