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

В начале Activity запускается Intent, и что-то делается с этим намерением.

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

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

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

Solutions Collecting From Web of "Как очистить намерение, которое начало действие?"

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

 Intent activityIntent = null; // Subsequent times it's 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. */ } 

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

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

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

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

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

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

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

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

 putExtra("DONE", 0) 

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

 hasExtra("DONE") 

легко

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

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

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

 getIntent().setData(null); 

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

Даже после ручной очистки настроек 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's 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.

Если вы установите действие намерения, вы можете очистить его с помощью 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 } } ... 

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