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(), он не будет выполняться в вашей задаче, и поэтому вы сразу получите результат отмены."

Другие вопросы по тегам