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

StackOverflow https://stackoverflow.com/questions/2424488

Вопрос

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

Если я перейду в раздел «Активность» B, C, и D там у меня есть ярлыки меню для возврата к корневой активности моих приложений (A).

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

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

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

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

Это было полезно?

Решение

Это должно сработать.

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

Когда вы создаете намерение запустить приложение, используйте:

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

Это то, что должно быть необходимо.

Другие советы

Что на самом деле сработало для меня в конце концов, так это:

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

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

Режимы «стандарта» и «синглепов» отличаются друг от друга только одним уважением:Каждый раз, когда появляется новое намерение для «стандартной» деятельности, новый экземпляр класса создается, чтобы ответить на это намерение.Каждый экземпляр обрабатывает одно намерение.Аналогичным образом, новый экземпляр деятельности «синглепов» также может быть создан для обработки нового намерения.Однако, Если целевая задача уже имеет существующий экземпляр деятельности в верхней части его стека, этот экземпляр получит новое намерение (в onnewintent () вызове);новый экземпляр не создается.

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

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

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

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

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

Все действия хранятся в стеке («первый пришел последним»), поэтому, если ваше текущее действие находится на вершине стека и вы определили его в файле манифеста как SingleTop

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

Если вы находитесь в деятельности, воссоздайте деятельность, она не войдет в Oncreate, возобновит onnewintent (), и вы можете увидеть, создав уведомление, не: ̇f, вы не реализуете Onnewintent (намерения), вы не получите новых намерений.

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);

        }

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top