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

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

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

Код выглядит так:

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

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

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

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

  

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

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

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

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

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

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

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

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

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

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

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

если вы находитесь в ActivityA, заново создайте действие, которое он не будет вводить onCreate возобновит onNewIntent (), и вы увидите, создав уведомление Not: Если вы не реализуете 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); } 

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

  • Android: захват возврата активности
  • Как правильно начать работу с PostExecute в Android?
  • преобразование активности в fragment
  • Доступ к SharedPreferences с помощью статических методов
  • В чем разница между Activity и Context?
  • Лучшая практика передачи контекста в classы без активности?
  • Связь между деятельностью и службой
  • Как показать активность до того, как мое приложение будет удалено (Android)
  • Как вернуть результат (startActivityForResult) из TabHost Activity?
  • Сделать новый вид активности за старым во время перехода
  • Текст Android-центра на canvasе
  • Давайте будем гением компьютера.