android - studio - onActivityResult no se activa si el modo de actividad de inicio es singleInstance
onactivityresult camera android (5)
Creo que el problema es que SingleInstance no permite que la actividad llamada exista en la misma tarea que la persona que llama, por lo tanto, no puede devolver el valor a la persona que llama.
Considere usar singleTask en su lugar:
singleTask
El sistema crea la actividad en la raíz de una nueva tarea y enruta el intento hacia ella. Sin embargo, si ya existe una instancia de la actividad, el sistema enruta el intento a la instancia existente a través de una llamada a su método onNewIntent (), en lugar de crear uno nuevo.
única instancia
Igual que "singleTask", excepto que el sistema no inicia ninguna otra actividad en la tarea que contiene la instancia. La actividad siempre es el único y único miembro de su tarea.
http://developer.android.com/guide/topics/manifest/activity-element.html
Tengo una actividad que es básicamente mi actividad principal y su modo de lanzamiento es instancia única. Pero debido a singleInstance, la devolución de llamada onActivityResult()
no se onActivityResult()
. Y si cambio el modo de lanzamiento en mi archivo de manifiesto a cualquier otro modo, funciona bien.
¿Puedes explicar por qué esta devolución de llamada no funciona?
No puede usar singleInstance
o singleTask
con el método startActivityForResult
.
El modo estándar o el modo de inicio singleTop solucionarán el problema.
Si una actividad es singleInstance
, será la única en la tarea, por lo que siempre será la parte superior de la tarea. Entonces, cuando llame a startActivityForResult
, activará el método de devolución de llamada inmediatamente.
Una actividad de " singleInstance " no permite que otras actividades singleInstance parte de su tarea. Es la única actividad en la tarea. Si comienza otra actividad, esa actividad se asigna a una tarea diferente. La actividad siempre es el único y único miembro de su tarea.
Creo que onActivityResult
no funcionará con singleInstance
Compruebe el método "ActivityStarter.computeLaunchingTaskFlags ()":
} else if (mSourceRecord.launchMode == LAUNCH_SINGLE_INSTANCE) {
// The original activity who is starting us is running as a single
// instance... this new activity it is starting must go on its
// own task.
mLaunchFlags |= FLAG_ACTIVITY_NEW_TASK;
Esa es la razón por la cual se agrega el indicador NEW_TASK cuando su actividad original con el modo de inicio de instancia única.
Compruebe el método "ActivityStarter.sendNewTaskResultRequestIfNeeded ()":
if (sourceStack != null && (mLaunchFlags & FLAG_ACTIVITY_NEW_TASK) != 0) {
// For whatever reason this activity is being launched into a new task...
// yet the caller has requested a result back. Well, that is pretty messed up,
// so instead immediately send back a cancel and let the new task continue launched
// as normal without a dependency on its originator.
Slog.w(TAG, "Activity is launching as a new task, so cancelling activity result.");
sourceStack.sendActivityResultLocked(-1 /* callingUid */, mStartActivity.resultTo,
mStartActivity.resultWho, mStartActivity.requestCode, RESULT_CANCELED,
null /* data */);
Esa es la razón por la cual FLAG_ACTIVITY_NEW_TASK siempre devuelve inmediatamente RESULT_CANCELED.