Активность не получает нового намерения

#android

#Android

Вопрос:

По разным причинам мое приложение создает записи в панели уведомлений. Когда пользователь нажимает на уведомление, я хочу отобразить пользовательское действие, которое представляет запись в определенном формате.

 Intent intent = new Intent(applicationContext, TextMessageViewerActivity.class);
intent.putExtra("text_message", someText);
PendingIntent contentIntent = PendingIntent.getActivity(applicationContext, 0, intent, 0);
// now create a notification and post it. no fancy flags
  

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

 public class TextMessageViewerActivity extends Activity
{
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.text_viewer);
    }

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

        Intent startingIntent = getIntent();
        String message = startingIntent.getStringExtra("text_message");
        String displayMessage = message != null ? message : "No message found";

        ((TextView)findViewById(R.id.text_viewer_text_id)).setText(displayMessage);
    }
}
  

Чего я не понимаю в жизненном цикле активности Android?

Ответ №1:

Сегодня я узнал кое-что новое: PendingIntent.getActivity может возвращать то же самое PendingIntent для данного Activity . Чтобы создать уникальный PendingIntent для каждой уникальной Intent отправки, вы должны указать PendingIntent.FLAG_ONE_SHOT флаг при его создании.

Так, например, строка создания PendingIntent в моем коде выше должна была быть:

 PendingIntent contentIntent = PendingIntent.getActivity(applicationContext, 0, intent, PendingIntent.FLAG_ONE_SHOT);
  

Ответ №2:

Я думаю, вам нужно использовать onNewIntent() функцию. Это изменяет намерение, которое видит ваша Activity. Использование:

 /**
  * onResume is called immediately after this.
  */
@Override
protected void onNewIntent(Intent intent) {
    setIntent(intent);
    resolveIntent(intent);
}
  

Здесь resolveIntent используется для фактической обработки нового входящего намерения. Посмотрите документацию здесь.

Комментарии:

1. На самом деле это то, о чем я подумал сначала, но onNewIntent не вызывается, если вы не укажете «singleTop» для своей activity. Тем не менее, это интуитивный ответ.