Очистка намерения - PullRequest
       22

Очистка намерения

91 голосов
/ 07 ноября 2010

Мое Android-приложение вызывается из-за намерения, передающего информацию (ожидающего в строке состояния).

Когда я нажимаю кнопку «Домой» и снова открываю свое приложение, удерживая кнопку «Домой», оно снова вызывает намерениетакие же дополнения все еще есть.

    @Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
      super.onSaveInstanceState(savedInstanceState);
    }
    @Override
    public void onRestoreInstanceState(Bundle savedInstanceState) {
      super.onRestoreInstanceState(savedInstanceState);
    }

это код, который не запускается так, как предполагается

    String imgUrl;
    Bundle extras = this.getIntent().getExtras();


    if(extras != null){
        imgUrl = extras.getString("imgUrl");
        if( !imgUrl.equals(textView01.getText().toString()) ){

            imageView.setImageDrawable( getImageFromUrl( imgUrl ) );
            layout1.setVisibility(0);
            textView01.setText(imgUrl);//textview to hold the url

        }

    }

И мое намерение:

public void showNotification(String ticker, String title, String message, 
    String imgUrl){
    String ns = Context.NOTIFICATION_SERVICE;
    NotificationManager mNotificationManager = 
        (NotificationManager) getSystemService(ns);
    int icon = R.drawable.icon;        // icon from resources
    long when = System.currentTimeMillis();         // notification time
    CharSequence tickerText = ticker;              // ticker-text

    //make intent
    Intent notificationIntent = new Intent(this, activity.class);
    notificationIntent.putExtra("imgUrl", imgUrl);
    notificationIntent.setFlags(
        PendingIntent.FLAG_UPDATE_CURRENT | 
        PendingIntent.FLAG_ONE_SHOT);
    PendingIntent contentIntent = 
        PendingIntent.getActivity(this, 0, 
        notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT | 
        PendingIntent.FLAG_ONE_SHOT);

    //make notification
    Notification notification = new Notification(icon, tickerText, when);
    notification.setLatestEventInfo(this, title, message, contentIntent);
    //flags
    notification.flags = Notification.FLAG_SHOW_LIGHTS | 
        Notification.FLAG_ONGOING_EVENT | 
        Notification.FLAG_ONLY_ALERT_ONCE | 
        Notification.FLAG_AUTO_CANCEL;
    //sounds
    notification.defaults |= Notification.DEFAULT_SOUND;
    //notify
    mNotificationManager.notify(1, notification);
}

Есть ли способ очистить намерение или проверить, использовалось ли оно ранее?

Ответы [ 19 ]

1 голос
/ 10 августа 2016

Когда вы закончите обработку Намерения, сделайте это:

setIntent(null);

Вы не увидите снова обработанный Intent, и вы не сможете скрыть проблему, отредактировав содержимое обработанного Intent.

0 голосов
/ 06 марта 2018

Я сталкиваюсь с той же проблемой и пытаюсь использовать вышеуказанные методы, но это не работает.

Я думаю, что это может быть причиной запуска режима acitvity, в котором я использовал режим singleTop.

Когда я выполняю фоновое приложение и использую RamEater для имитации проблемы, у которой всегда есть дополнительная цель, даже если я установил ее в ноль или удалилkey.

Проблема устранена путем использования хранилища настроек на Android для проверки того, что прошло.

0 голосов
/ 15 сентября 2017

Прямой способ - избежать вызова getIntent () из методов, отличных от onCreate ().Но это вызовет проблемы при следующем запуске, если пользователь оставил нашу активность, нажав кнопку «Домой».Я думаю, что эта проблема не имеет полностью функционального решения.

0 голосов
/ 28 мая 2017

Надеюсь, это поможет всем. Итак, сначала мы получаем намерение

//globally
Intent myIntent;

Поместите это где-нибудь наСоздать

myIntent = getIntent();
String data = myIntent.getStringExtra("yourdata");
//Your process here

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

@Override
protected void onDestroy() {
    //TODO: Clear intents
    super.onDestroy();
    myIntent.removeExtra("data");
}
@Override
protected void onBackPressed() {
    //TODO: Clear intents
    super.onBackPressed();
    myIntent.removeExtra("data");
}

Вы понимаете, если этого недостаточно, просто найдите больше обратных вызовов

0 голосов
/ 26 февраля 2017

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

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

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 / Intent.

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

0 голосов
/ 30 июля 2012
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
intent.addCategory(Intent.CATEGORY_HOME);  
startActivity(intent);
0 голосов
/ 07 января 2014

Как насчет этого?Устанавливает newIntent в качестве намерения.

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    setIntent(intent);
}
0 голосов
/ 24 мая 2014

Хотя Intent.removeExtra("key") удаляет один конкретный ключ из дополнений, существует также метод Intent.replaceExtras (Bundle) , который можно использовать для удаления всего дополнения из намерения, если null передается как параметр.

Из документов:

Полностью заменить дополнения в Намерении на данный Пакет дополнительные.

Параметры
дополнения Новый набор дополнений в Intent или null для удаления всех дополнений.

Поскольку методы putXXX () инициализируют дополнительные функции свежим Bundle, если он нулевой, это не проблема.

0 голосов
/ 05 ноября 2014

Как насчет того, когда вы хотите очистить намерение - заменить его пустым?

например.

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    setIntent(intent);
}

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

    Intent theIntent = getIntent();
    if ("myaction".equals(theIntent.getAction()) {
         handleIntent();
         onNewIntent(new Intent());  // <--- "clear" the intent by setting empty one
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...