Arhn - архитектура программирования

Дополнительные данные намерения Android теряются

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

Я прикрепляю данные к намерению следующим образом:

Intent i = new Intent(ActivityFrom.this, ActivityTo.class);
i.putExtra(CONST_KEY, true);
startActivity(i);

С

public static final String CONST_KEY = "MyBooleanValue";

Я пытаюсь получить данные в запущенном методе onCreate ActivityTo следующим образом:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Bundle extra = getIntent().getExtras();
    if ( extra != null ) {
        boolean b = extra.getBoolean(ActivityFrom.CONST_KEY);
    }
}

Однако я никогда не сталкиваюсь с блоком if, потому что Bundle всегда null.

Почему мои дополнения потеряны? Что мне нужно изменить, чтобы получить дополнения, которые я вложил в намерение?

Изменить

  • Исправил опечатку в коде
  • Добавлено полное объявление метода onCreate
  • Вот объявление ActivityTo в манифесте:

    <activity
        android:name=".ActivityTo"
        android:launchMode="singleTask"
        android:screenOrientation="portrait">
    </activity>
    
30.11.2015

  • не могли бы вы опубликовать onCreate ActivityTo, а также объявление активности в файле манифеста? 30.11.2015
  • getExtras, а не getExtra!! 30.11.2015
  • Удалить singleTask режим запуска. Вы не должны делать это в любом случае. 30.11.2015
  • @DavidWasser Почему бы и нет? 04.12.2015
  • В общем, специальные режимы запуска singleTask и singleInstance следует использовать только в очень специфических случаях, например, когда вы создаете лаунчер или замену HOME-экрану. У них масса побочных эффектов, которые на первый взгляд неочевидны, и в 99% случаев они используются не там, где должны быть, и создают больше проблем, чем решают. Стандартное поведение по умолчанию должно работать для большинства приложений. 04.12.2015

Ответы:


1

Проблема заключается в android:launchMode="singleTask"атрибуте принимающей задачи. Если этот параметр установлен, все намерения, нацеленные на действие ActivityTo, принимаются одним и тем же объектом. Если действие уже создано, намерение отправляется через метод действия onNewIntent(Intent). Переопределите это так:

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

Таким образом, вы можете получить новое намерение с помощью файла getIntent().

04.12.2015
  • Удивительно. Вы спасли мою жизнь! 07.12.2020

  • 2

    Пожалуйста, убедитесь, что свойства вашего объекта в writeToParcel(Parcel parcel, int flags) соответствуют чтению из посылки в YourObject(in)

    Например

    public class User implements Parcelabel { 
    private String name;
    private String addrss;
    private String city;
    
    // read from parcel
    protected User(Parcel in) {
    name = parcel.readString();
    address = parcel.readString();
    city = parcel.readString();
    }
    
    // write to parcel
    writeToParcel(Parcel parcel, int flags){
    parcel.writeString(name);
    parcel.writeString(address);
    parcel.writeString(city);
    }
    }
    
    13.01.2020

    3

    Я думаю, тебе стоит попробовать

    if(getIntent().getBooleanExtra(ActivityFrom.CONST_KEY,false)!=null){
         Boolean b=getIntent().getBooleanExtra(ActivityFrom.CONST_KEY,false);
    }
    
    30.11.2015
  • Для метода getBooleanExtra требуются два параметра: ключ и значение по умолчанию, если для указанного ключа не найдено значение. Этот фрагмент кода не компилируется. 30.11.2015
  • Он по-прежнему не компилируется, потому что метод getBooleanExtra() возвращает примитивный объект boolean, а не объект Boolean. Следовательно, его нельзя сравнивать с null. 30.11.2015
  • Этот ответ бесполезен. И неправильно. Если вы хотите знать, существует ли дополнение в Intent, вы используете hasExtra(key). 04.12.2015
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..