Как очистить намерение, которое начало действие?
В начале Действие запускается с помощью намерения, и что-то делается с этим намерением.
Когда я меняю ориентацию своей активности, она перезагружается снова, и Intent передается в Activity.
Как я могу удалить это намерение, чтобы предотвратить повторное использование Activity?
Я пробовал setIntent(null)
, но без результата.
Ответы
Ответ 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...
}
}