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

Новый Intent() запускает новый экземпляр с Android: launchMode = "singleTop"

У меня есть Activity A с android:launchMode="singleTop" в манифесте.

Если я перейду к Activity B, C и D, там есть ярлыки меню, чтобы вернуться к активности root в моих приложениях (A).

Код выглядит следующим образом:

Intent myIntent = new Intent(getBaseContext(), MainActivity.class);
startActivity(myIntent);

Однако вместо того, чтобы возвращаться к уже существующему экземпляру A моего MainActivity.class, он создает новый экземпляр → он переходит в onCreate() вместо onNewIntent().

Это не ожидаемое поведение, верно?

4b9b3361

Ответ 1

Это должно сделать трюк.

<activity ... android:launchMode="singleTop" />

При создании намерения начать использовать приложение:

Intent intent= new Intent(context, YourActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);

Это необходимо.

Ответ 2

Что в действительности работало для меня в конце, было следующее:

Intent myIntent = new Intent(getBaseContext(), MainActivity.class);
myIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(myIntent);

Ответ 3

Цитата из документация:

"Стандартный" и "SingleTop" режимы отличаются друг от друга только одним уважение: каждый раз, когда появляются новые намерения для "стандартной" деятельности новый экземпляр класса создается для ответьте на это намерение. Каждый экземпляр обрабатывает одно намерение. Аналогичным образом, новый экземпляр действия "singleTop" также могут быть созданы для обработки нового намерение. Однако , если целевая задача уже имеет существующий экземпляр деятельность на вершине ее стек, этот экземпляр получит новое намерение (в onNewIntent() вызов); новый экземпляр не создается.

Я не уверен на 100%, что означает "уже имеет существующий экземпляр активности в верхней части стека", но, возможно, ваша деятельность не соответствует этому условию.

Будет ли singleTask или singleInstance работать для вас? Или, возможно, вы могли бы попробовать установить FLAG_ACTIVITY_SINGLE_TOP в намерении, которое вы создаете, чтобы узнать, не изменилось ли это, хотя я не думаю, что это будет.

Ответ 4

Вы можете вернуться к тому же существующему экземпляру Activity с помощью android:launchMode="singleInstance"

в манифесте. Когда вы вернетесь к A из B, может понадобиться finish(), чтобы уничтожить B.

Ответ 5

Во-первых, структура стека может быть исследована. Для режима запуска: singleTop
Если экземпляр одной и той же активности уже находится поверх стека задач, этот экземпляр будет повторно использован для ответа на намерение.

Все действия хранятся в стеке ( "сначала в последнем выходе" ), поэтому, если текущая активность находится в верхней части стека, и если вы определяете ее в файле manifest.file как singleTop

android:name=".ActivityA"
android:launchMode="singleTop"

если вы находитесь в ActivityA, заново создайте действие, которое он не будет вводить onCreate, возобновит onNewIntent(), и вы увидите, создав уведомление Не: Если вы не реализуете onNewIntent (Intent), вы не получите новых намерений.

Intent activityMain = new Intent(ActivityA.this,
                        ActivityA.class);

                activityMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                        | Intent.FLAG_ACTIVITY_SINGLE_TOP);
                startActivity(activityMain);




    @Override
        protected void onNewIntent(Intent intent) {

            super.onNewIntent(intent);

            notify("onNewIntent");
        }

        private void notify(String methodName) {

            String name = this.getClass().getName();
            String[] strings = name.split("\\.");

            Notification noti = new Notification.Builder(this)
                    .setContentTitle(methodName + "" + strings[strings.length - 1])
                    .setAutoCancel(true).setSmallIcon(R.drawable.ic_launcher)
                    .setContentText(name).build();
            NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
            notificationManager.notify((int) System.currentTimeMillis(), noti);

        }

Ответ 6

Это связано с тем, что исходная активность A уже уничтожается к моменту ее запуска из B, C или D. Поэтому onCreate будет вызываться вместо onNewIntent(). Один из способов решения этого - всегда уничтожать существующий A (используя FLAG_ACTIVITY_CLEAR_TASK | FLAG_ACTIVITY_NEW_TASK соединение при запуске) перед запуском нового A, поэтому onCreate всегда будет вызываться, и вы поместите код onNewIntent() в onCreate, проверив, будет ли getIntent ( ) - это цель, с которой вы начали.