У меня есть 3 класса в моем примере: Класс A, основной вид деятельности. Класс A называет startActivityForResult:
Intent intent = new Intent(this, ClassB.class);
startActivityForResult(intent, "STRING");
Класс B, этим классом является TabActivity:
Intent intent = new Intent(this, ClassC.class);
tabHost.addTab...
Класс C, этим классом является регулярное Действие:
Intent intent = this.getIntent();
intent.putExtra("SOMETHING", "EXTRAS");
this.setResult(RESULT_OK, intent);
finish();
onActivityResult называют в Классе A, но resultCode RESULT_CANCELED
вместо RESULT_OK
и возвращенное намерение является пустым. Как я возвращаю что-то из Действия в TabHost?
Я понимаю, что проблема состоит в том, что мой Класс C на самом деле работает в Классе B, и Класс B - то, что возвращается RESULT_CANCELED
назад к Классу A. Я просто еще не знаю работу вокруг.
О боже! Проведя несколько часов и загрузив исходники Android, я наконец пришел к решению.
Если вы посмотрите на класс Activity, вы увидите, что метод finish ()
отправляет результат, только если для свойства mParent
установлено значение null
. В противном случае результат будет потерян.
public void finish() {
if (mParent == null) {
int resultCode;
Intent resultData;
synchronized (this) {
resultCode = mResultCode;
resultData = mResultData;
}
if (Config.LOGV) Log.v(TAG, "Finishing self: token=" + mToken);
try {
if (ActivityManagerNative.getDefault()
.finishActivity(mToken, resultCode, resultData)) {
mFinished = true;
}
} catch (RemoteException e) {
// Empty
}
} else {
mParent.finishFromChild(this);
}
}
Итак, мое решение - установить результат для родительского действия, если оно есть, например:
Intent data = new Intent();
[...]
if (getParent() == null) {
setResult(Activity.RESULT_OK, data);
} else {
getParent().setResult(Activity.RESULT_OK, data);
}
finish();
Я надеюсь, что это будет полезно, если кто-то еще раз будет искать обходной путь для этой проблемы.
Вы также можете реализовать onActivityResult в классе B и запустить класс C с помощью startActivityForResult. Как только вы получите результат в классе B, установите результат там (для класса A) на основе результата класса C. Я не пробовал это, но я думаю, что это должно сработать.
Еще одна вещь, на которую следует обратить внимание, - это то, что Activity A не должно быть действием singleInstance. Чтобы startActivityForResult работал, ваш класс B должен быть вспомогательным действием для Activity A, а это невозможно в одном действии экземпляра, новое Activity (класс B) запускается в новой задаче.