Android Home активность запускает подактивность - PullRequest
2 голосов
/ 21 июня 2011

Я относительно новичок в программировании на Android.На работе мне дали задание, в котором мне нужно было создать средство запуска действий Custom Home.Я провел небольшое исследование и нашел пример на сайте разработчика Android ( home sample ).Это было начало для моего прототипа.

Для пользовательской операции Home необходимо потребовать от пользователя аутентификации (введите несколько простых учетных данных).Я думал о том, чтобы запустить вспомогательное действие из домашнего действия и передать результаты в намерении домашнему действию.Мне нужно иметь возможность собирать информацию об этих полномочиях, и эта информация должна была быть передана обратно в домашнюю деятельность.Тем не менее, у меня есть проблемы при попытке этого.Я получаю журнал в 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 ]

10 голосов
/ 21 июня 2011

Проблема заключается в том, что вы объявили свои действия с launchMode = "singleInstance", поэтому Android создает новую задачу (то есть новый процесс), когда запускает действие входа в систему. Действия в разных задачах не могут возвращать результаты друг другу. Из документа Activity.startActivityForResult ():

Например, если вы занимаетесь запуск использует запуск SingleTask режим, он не будет работать в вашей задаче и Таким образом, вы сразу получите отменить результат.

singleInstance похож на singleTask, но еще более ограничен. Попробуйте удалить атрибут launchMode из своего манифеста, чтобы действие Login было запущено в той же задаче, а затем используйте FLAG_ACTIVITY_NEW_TASK, когда вам нужно запустить другое действие в отдельной задаче.

Barry

1 голос
/ 18 августа 2015

В документации сказано:

Например, если запускаемое вами действие использует режим запуска singleTask, оно не будет выполняться в вашей задаче и, таким образом, вы сразу получите результат отмены.

ЭТО НЕПРАВИЛЬНО .

Вы можете использовать singleTask очень хорошо, вы не можете использовать singleInstance .

Давайте вернемся к проблеме.В чем проблема?

Проблема в том, что когда вы вызываете startActivityForResult() для действия, вызывающее действие и запускаемое действие должны быть в одной задаче, чтобы startActivityForResult() работал правильно, что означаетчто вы не можете вызвать startActivityForResult () к действию, используя Intent.FLAG_ACTIVITY_NEW_TASK .

, почему singleInstance не работает?

Поскольку действие «singleInstance» является единственным действием в его задаче.Если он запускает другое действие, то это действие будет запущено в другую задачу независимо от режима запуска - как если бы FLAG_ACTIVITY_NEW_TASK был в намерении.Во всех других отношениях режим «singleInstance» идентичен «singleTask».

Почему singleTask работает?

Поскольку singleTask не требует созданияновое задание для запускаемых новых действий.

enter image description here

Я цитировал этот ответ , чтобы объяснить разницу между двумя режимами запуска,

0 голосов
/ 21 июня 2011

Вы объявили setResult(int resultCode, Intent data) в своей активности входа в систему. Документация Android гласит «Обратите внимание, что этот метод должен использоваться только с протоколами Intent, которые определены для возврата результата». Если это не так или некоторые другие условия соответствуют, как в документации Activity.startActivityForResult(), он не будет выполняться в вашей задаче, и, таким образом, вы немедленно получите результат отмены. "

...