Android Home активность запускает подактивность
Я относительно новичок в программировании Android. На работе мне дали задание, в котором мне нужно было создать пусковую установку Custom Home. Я провел небольшое исследование и нашел пример на сайте разработчика Android ( домашний пример). Это было начало для моего прототипа.
Пользовательское домашнее действие должно потребовать от пользователя аутентификации (введите несколько простых учетных данных). Я думал о том, чтобы запустить вспомогательное действие из домашнего действия и передать результаты в намерении домашнему действию. Мне нужно иметь возможность собирать информацию об этих учетных данных, и эта информация должна была быть передана обратно в домашнюю деятельность. Тем не менее, у меня есть проблемы при попытке этого. Я получаю журнал в LogCat, в котором говорится следующее: "Активность запускается как новая задача, поэтому отмена результата активности".
Я знаю о методе startActivityForResult, но, похоже, он мне не подходит. Здесь я запускаю упражнение из своей Домашней активности:
@Override
protected void onResume() {
super.onResume();
bindRecents();
Intent iii = new Intent(this, Login.class);
startActivityForResult(iii, STATIC_LOGIN_INTEGER_VALUE);
}
Когда этот код выполняется, я получаю вышеупомянутый журнал из тега ActivityManager.
У моего входа в систему есть кнопка, по которой пользователь нажимает после ввода своих учетных данных. Если учетные данные хорошие, я пытаюсь сделать следующее (я поместил несколько журналов, чтобы попытаться выяснить, что происходит):
public void onClick(View src) {
// check for authentic credentials
if(IsValid())
{
Intent loginAuth = new Intent("Login");
loginAuth.putExtra("userRole", userRole);
Log.d("LOGIN", "Setting result...");
if (getParent() == null) {
Log.d("LOGIN", "Parent was null");
setResult(Activity.RESULT_OK, loginAuth);
}
else {
Log.d("LOGIN", "setting result on parent...");
getParent().setResult(Activity.RESULT_OK, loginAuth);
}
Log.d("LOGIN", "Finishing the activity");
finish();
}
}
Я определил эти действия в моем файле манифеста следующим образом:
<activity android:name="Home"
android:theme="@style/Theme"
android:launchMode="singleInstance"
android:stateNotNeeded="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.HOME"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity android:name="Login"
android:label="Login"
android:launchMode="singleInstance">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.HOME" />
</intent-filter>
</activity>
Я играл с фильтром намерений при входе в систему. У меня изначально было ничего не установлено. У меня также был бланк launchMode (который по умолчанию стандартный, я считаю). Я поэкспериментировал с большинством этих опций, и, похоже, ничто не меняет того факта, что ActivityManager, похоже, хочет запустить действие как новую задачу и хочет игнорировать возвращенное намерение (которое мне нужно).
3 ответа
Проблема в том, что вы объявили свои действия с launchMode="singleInstance", поэтому Android создает новую задачу (то есть новый процесс), когда он запускает действие входа в систему. Действия в разных задачах не могут возвращать результаты друг другу. Из документов Activity.startActivityForResult():
Например, если запускаемая вами операция использует режим запуска singleTask, она не будет выполняться в вашей задаче и, таким образом, вы сразу получите результат отмены.
singleInstance похож на singleTask, но еще более ограничен. Попробуйте удалить атрибут launchMode из своего манифеста, чтобы действие Login было запущено в той же задаче, а затем с помощью FLAG_ACTIVITY_NEW_TASK, когда вам нужно запустить другое действие в отдельной задаче.
Барри
В документации сказано
Например, если запускаемая вами операция использует режим запуска singleTask, она не будет выполняться в вашей задаче и, таким образом, вы сразу получите результат отмены.
ЭТО НЕПРАВИЛЬНО.
Вы можете просто использовать singleTask, но вы не можете использовать singleInstance.
Давайте вернемся к проблеме. В чем проблема?
Проблема в том, что когда вы звоните startActivityForResult()
в действии вызывающее действие и запускаемое действие должны быть в одной задаче для startActivityForResult()
для правильной работы это означает, что вы не можете вызвать startActivityForResult() к действию, используя Intent.FLAG_ACTIVITY_NEW_TASK.
почему SingleInstance не работает?
Поскольку действие "singleInstance" является единственным в своем роде. Если он запускает другое действие, то это действие будет запущено в другую задачу независимо от режима запуска - как если бы FLAG_ACTIVITY_NEW_TASK был в намерении. Во всех других отношениях режим "SingleInstance" идентичен "SingleTask".
Почему SingleTask работает?
Потому что singleTask не требует создания новой задачи для запускаемых новых действий.
Я процитировал этот ответ, чтобы объяснить разницу между двумя режимами запуска.
Вы объявили setResult(int resultCode, Intent data)
в вашей активности входа в систему. Документация Android гласит: "Обратите внимание, что этот метод следует использовать только с протоколами Intent, которые определены для возврата результата". Если это не так или некоторые другие условия соответствуют, как в документации Activity.startActivityForResult()
, он не будет выполняться в вашей задаче, и поэтому вы сразу получите результат отмены."