Получение намерения и его дополнений, но не намерение действия, которое запустило новое действие

Когда вы собираетесь начать новое действие и хотите передать переменную, вы обычно просто делаете это:

Intent intent = new Intent().setClass(this, NewActivity.class);
intent.putExtra("variable", variable);
startActivity(intent);

И когда вы читаете лишнее (в новом действии), вы делаете это:

Intent intent = getIntent();
if(intent != null)
{
    variable = intent.getIntArrayExtra("variable");
}

Теперь в моем приложении есть экран загрузки, на котором происходит вся загрузка. Это происходит в основной деятельности. Во время этого процесса многие переменные обновляются/изменяются. У меня есть много других действий, и мне нужно передать эти недавно обновленные переменные некоторым из этих действий. Проблема в том, что эти действия не запускаются моим основным действием.

Есть ли способ сделать это в моей основной деятельности:

Intent newIntent1 = new Intent().setClass(MainActivity.this, NewActivity1.class);
newIntent1.putExtra("var1", var1);

а затем запустить действие, используя startActivity(newIntent1); из другого действия?

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

Intent intent;
try
{
    intent = Intent.parseUri("content://com.mycompany.android.MainActivity", 0);
    if(intent != null)
    {
        var1 = intent.getIntArrayExtra("var1");
    }
}
catch (URISyntaxException e)
{
    e.printStackTrace();
}

Это не работает, переменная var1 имеет значение null (инициализирована как таковая).

Честно говоря, я понятия не имею, как это сделать или как вообще работает Intent.parseUri. Документация для этого действительно плоха для новичка, такого как я.


person gosr    schedule 07.08.2011    source источник
comment
где в намерении, которое вы начинаете, вы пытаетесь прочитать значения из намерения? при создании? onNewIntent?   -  person Brandon Haugen    schedule 07.08.2011
comment
@Brandon Haugen: я пытаюсь прочитать это в методе onCreate.   -  person gosr    schedule 07.08.2011
comment
вы говорите, что действия не запускаются вашей основной деятельностью, так кто же их запускает? Дело в том, что если это не первый запуск активности, попробуйте прочитать значения в методе onNewIntent активности вместо onCreate   -  person Brandon Haugen    schedule 07.08.2011


Ответы (2)


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

Нет, не знаешь.

Вам нужно написать реальную модель данных (база данных, поставщик контента, POJO в статическом элементе данных) и сделать так, чтобы все действия ссылались на эту общую модель данных.

person CommonsWare    schedule 07.08.2011
comment
Да, похоже, перейдем к базе данных. - person gosr; 08.08.2011
comment
Другим, у кого могут быть те же проблемы, что и у меня изначально, я могу с уверенностью сказать, что использовать базу данных намного проще. - person gosr; 09.08.2011

Было бы проще просто использовать широковещательную рассылку для информирования об изменениях.

person Earl    schedule 07.08.2011
comment
Я никогда раньше не слышал о трансляции, не могли бы вы привести пример? Проверил документацию для него, но не совсем уверен, как это реализовать. - person gosr; 07.08.2011
comment
Я уже просматривал этот сайт, но эти примеры хороши, если вы собираетесь использовать состояние телефона или что-то подобное. Мне просто нужны мои собственные действия, и я не могу найти там пример, который показывает это. - person gosr; 07.08.2011
comment
В примере с широковещательным приемником удалите android.intent.action.PHONE_STATE из фильтра намерений и замените его именем, уникальным для вашего приложения. Чтобы отправить широковещательную рассылку получателям, используйте Intent intent = new Intent("my.unique.string"); sendBroadcast(intent);. Чтобы отправить дополнительную информацию получателям, перед sendBroadcast() вы можете использовать intent.putExtra("key", value); с любым количеством пар ключ/значение. - person Earl; 07.08.2011
comment
Спасибо, теперь я могу получить доступ к методу onReceive в приемнике. Теперь, как мне прочитать информацию из extra в моем новом действии? - person gosr; 07.08.2011
comment
Получатель получает намерение. Ознакомьтесь с документацией по классу Intent. Есть куча методов get для получения дополнений. Например, чтобы получить дополнительную строку, вы должны вызвать intent.getStringExtra("key") - person Earl; 07.08.2011
comment
Да, но мне не интересно читать лишнее в методе onReceive (или даже в классе Broadcast). Например, в другом классе мне нужно запустить действие, к которому я добавил некоторые дополнения. Я бы сделал так: Intent newIntent1 = new Intent("com.myapplication.android.NewActivity1");, а затем startActivity(newIntent1);. И затем, в этой новой деятельности, я читал дополнение, как показано в верхней части моего исходного поста. Но это не работает.. - person gosr; 07.08.2011
comment
И я настоятельно рекомендую вам переосмыслить свой подход. Способ получить информацию о чем-то, к чему у вас нет прямого доступа, — это сообщение. Дискуссия уже затянулась... удачи. - person Earl; 07.08.2011