Подтвердить что ты не робот

Как очистить намерение, которое начало действие?

В начале Действие запускается с помощью намерения, и что-то делается с этим намерением.

Когда я меняю ориентацию своей активности, она перезагружается снова, и Intent передается в Activity.

Как я могу удалить это намерение, чтобы предотвратить повторное использование Activity?

Я пробовал setIntent(null), но без результата.

4b9b3361

Ответ 1

У меня была аналогичная проблема. Это помогло мне. Возможно, вам также нужно использовать onSaveInstanceState (Bundle outState) и добавить дополнительные данные в пакет, поэтому inState не является нулевым, не уверен.

Intent activityIntent = null; // Subsequent times it null

@Override 
protected void onCreate(Bundle inState) {
    super.onCreate(inState);
    .
    .
    if (inState!=null) {
        /*Recreating activity with a saved state*/
    } else {
        /*Creating activity*/
        activityIntent = getIntent(); // First time through intent is used
        /*Get your Extra Intent data here. You will be capturing data on 1st creation. */
}

Ответ 2

Не используйте setIntent(null). Кажется, что, хотя иногда это может работать, при некоторых условиях первоначальное намерение может вернуться.

Вместо этого вызовите setIntent() с простым намерением, у которого нет действия, данных или дополнительных функций, например new Intent(Context, Class).

Действительно, использование setIntent() на самом деле не было хорошим решением для проектирования API. Вместо этого, как отметил dcg, убедитесь, что вы только проверяете свое намерение в первый раз, когда ваш savedInstanceState по-прежнему равен нулю.

Ответ 3

Если ваше намерение отправляется в вашу деятельность с действием (с помощью setAction), просто делайте следующее, когда вы получаете намерение, чтобы избежать множественного обращения с этим намерением при повороте экрана:

Intent i = getIntent();
i.setAction(null);
setIntent(i);

Ответ 4

Старый пост, но кто-то может это использовать.

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

Используйте начальное намерение в разделе "Резюме активности" и просто добавьте дополнительное значение

putExtra("DONE", 0)

И каждый раз, когда ваше приложение возобновляется, проверьте, имеет ли уже это значение:

hasExtra("DONE")

Легко

Ответ 5

Если вы установите действие намерения, вы можете очистить его с помощью getIntent().setAction("");

Например, в onCreate(...):

...
String action = getIntent().getAction();
if (action != null) {
  if (action.equals(YOUR_ACTION_WHATEVER)) {
    doSomethingHere(); // do something here
    getIntent().setAction(""); // clear the action
  }
}
...

Это очистит действие, иначе оно будет вызываться каждый раз, когда вы вращаете устройство.

Ответ 6

Мое предложение состояло в том, чтобы переключить это с помощью логической переменной, чтобы проверить, что ваша деятельность сначала создана или нет.

В противном случае вы можете посмотреть на свой метод onCreate, afaik это только выполняется, когда действие сначала создается.

Ответ 7

В моем случае мне нужно было установить данные в null:

getIntent().setData(null);

Ответ 8

intent.putExtra(YourKey,""); //reset the value to knknown setIntent(intent);

Ответ 9

Даже после ручной очистки настроек Intent и Intent после их анализа кажется, что Activity.getIntent() всегда возвращает исходное намерение, которое запустило Activity.

Чтобы обойти это, я рекомендую что-то вроде этого:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // The Intent provided by getIntent() (and its extras) will persist through a restore
    // via savedInstance.  Because of this, restoring this activity from a
    // an instance that was originally started with extras (deep-link or 
    // pre-defined destination) may cause un-desired behavior
    // (ie...infinite loop of sending the user directly to somewhere else because of a
    // pre-defined alternate destination in the Intent extras).
    //
    // To get around this, if restoring from savedInstanceState, we explicitly
    // set a new Intent *** to override the original Intent that started the activity.***
    // Note...it is still possible to re-use the original Intent values...simply
    // set them in the savedInstanceState Bundle in onSavedInstanceState.
    if (savedInstanceState != null) {
        // Place savedInstanceState Bundle as the Intent "extras"
        setIntent(new Intent().putExtras(savedInstanceState));
    }

    processIntent(getIntent())
}

private void processIntent(Intent intent) {
    if (getIntent().getExtras() == null) {
        // Protection condition
        return;
    }

    doSomething(intent.getExtras.getString("SOMETHING_I_REALLY_NEED_TO_PERSIST"));

    final String somethingIDontWantToPersist = 
        intent.getExtras.getString("SOMETHING_I_DONT_WANT_TO_PERSIST");

    if(somethingIDontWantToPersist != null) {
        doSomething(somethingIDontWantToPersist);
    }
}

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // Save selective extras from original Intent...
    savedInstanceState.putString("SOMETHING_I_REALLY_NEED_TO_PERSIST", "persistedValued");
    super.onSaveInstanceState(savedInstanceState);
}

Таким образом, существует механизм сброса первоначального намерения, сохраняя при этом возможность явного сохранения определенных частей оригинальных опций Intent/Intent.

Обратите внимание, что я не тестировал все режимы запуска Activity.

Ответ 10

Я хотел открыть приложение с помощью приемника вещания и вывести пользователя на 5-й экран приложения. Всякий раз, когда я получал этот широкий состав, я открывал приложение и проверял намерение на первом экране, если я получил намерение, я просто переношу пользователя на 5-й экран.

Но, к сожалению, когда я закрываю приложение даже из последних приложений и снова открываю приложение. Я получал то же самое намерение (в большинстве случаев), и это всегда приводило пользователя к 5-му экрану.

Итак, я наконец решил, используя входные данные с этой страницы, как показано ниже:

@Override
protected void onResume() {
    super.onResume();

    if (getIntent() != null && getIntent().getBooleanExtra(BundleKeys.INTENT_EXTRA_SHOULD_GO_TO_ROUTE_SET_UP, false)) {
        Log.i("Route_Setup_Broadcast", "Intent Not Null");

        //After consuming the intent data, reset the extras data
        Log.i("Route_Setup_Broadcast", "Resetting Intent");
        getIntent().putExtra(BundleKeys.INTENT_EXTRA_SHOULD_GO_TO_ROUTE_SET_UP, false);//Make it false, same key as used above in if statement.

        navigateToRouteSetUpScreen(true);//Move the user to the route setup
    }

    //Other part of the code...
}

Или, если у вас есть несколько дополнений с намерениями, и вы не хотите сбрасывать эти дополнения, вы также можете сделать getIntent(). SetAction ("");

@Override
protected void onResume() {
super.onResume();

if (getIntent() != null && getIntent().getAction().contentEquals("My_INTENT_ACTION_NAME")) {
        //After you have consumed your intent data
        getIntent().setAction("");//This way, the next time this screen comes up, this method will never be triggered, as the action name will be empty.

        //Other part of the code...
    }
}