Подтвердить что ты не робот

Как захватить новый Intent в onNewIntent()?

Я хочу передать новое, но другое, намерение в действие. Как вы различаете новое намерение и предыдущие намерения? Какой код входит в onNewIntent()? Пример будет очень полезен.

4b9b3361

Ответ 1

Новое намерение входит как часть onNewIntent(Intent). Оригинальный Intent по-прежнему доступен через getIntent().

Вы добавляете код, который вам нужен, в onNewIntent, чтобы обновить интерфейс с новыми параметрами; вероятно, похоже на то, что вы делаете в onCreate.

Кроме того, вы, вероятно, захотите вызвать setIntent(intent) в onNewIntent, чтобы убедиться, что будущие вызовы getIntent() в жизненном цикле Activity получают самые последние данные Intent.

Ответ 2

Как намерение прибывает в вашу деятельность, зависит от режима launchMode (см. документы для запуска в http://developer.android.com/guide/topics/manifest/activity-element.html#lmode).

  • Для стандартного режима запуска (по умолчанию) startActivity с новым намерением приведет к тому, что onCreate с этим намерением добавит новый экземпляр действия.

  • Для стартовых модов "singleTop" и "singleTask" startActivity с новым намерением приведет к тому, что

a) onCreate с этим намерением для нового экземпляра активности (если эта активность не была запущена) [в соответствии с "стандартом" выше] или b) onNewIntent с этим намерением к существующей деятельности (если эта деятельность уже была запущена).

Для b) второе намерение доступно в параметрах onNewIntent. То, что вы делаете с этим, зависит от вашего приложения. Некоторые приложения просто игнорируют это, в то время как другие будут делать setIntent() и начать повторную инициализацию/обновление обработки нового намерения.

Ответ 3

Вызванная деятельность - основная деятельность

public class MainActivity extends Activity
{
    public void onCreate(Bundle SavedInstanceState)
    {
    }

    @Override
    protected void onNewIntent(Intent intent) 
    {
        super.onNewIntent(intent);
        if(intent.getStringExtra("methodName").equals("myMethod"))
        {
            myMethod();
        }
    }

    public void myMethod()
    {
    }
}

Ваша деятельность по вызову

Код переходит к предыдущему намерению

public class CallingActivity extends Activity
{
    public void onCreate(Bundle savedInstanceState)
    {
        Intent i=new Intent(this,MainActivity.class);
        i.putExtra("methodName","myMethod");//goes to previous INtent
        startActivity(i);//will trigger only myMethod in MainActivity
    }
}

Ваша деятельность по вызову

Код запускает новую активность с использованием такого типа намерений

public class CallingActivity extends Activity
{
    public void onCreate(Bundle savedInstanceState)
    {
        Intent i=new Intent(this,MainActivity.class);
        startActivity(i);//will trigger New Activity i.e. MainActivity
    }
}

Ответ 5

Если вы не хотите, чтобы ваша деятельность повторно использовала новое намерение в каждом последующем onResume(), я бы рекомендовал сохранить намерение в поле экземпляра вместо setIntent(intent).

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

Подробнее в моем ответе здесь: fooobar.com/info/149936/...

setIntent(intent) был описан как ошибка разработчиком Android Framework: https://groups.google.com/forum/#!topic/android-developers/vrLdM5mKeoY