Откройте существующую активность с обратным стеком, нажав на виджет приложения. Как?

Я хочу открыть свое приложение, нажав на виджет приложения. Так.

remote_views.setOnClickPendingIntent( R.id.layout, PendingIntent.getActivity( context, 0, new Intent( context, Main.class ).setFlags( Intent.FLAG_ACTIVITY_NEW_TASK ), PendingIntent.FLAG_IMMUTABLE ) );

Но я хочу открыть существующее приложение и сохранить стек. Если я уберу Intent.FLAG_ACTIVITY_NEW_TASK, то на новом Android я получу:

java.lang.RuntimeException: вызвано: android.util.AndroidRuntimeException: вызов startActivity() из вне контекста Activity требуется FLAG_ACTIVITY_NEW_TASK флаг.

Я могу установить в файле манифеста

    <activity
        android:name = ".Main"
        android:launchMode = "singleInstance"
        android:exported = "true"
        >

и откройте существующую активность, но, кроме того, потеряли задний стек, затем нажмите кнопку «Домой» и снова запустите приложение с помощью значка, после чего задний стек также будет потерян.

Итак, возможно ли это?

1
0
56
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я не уверен, что это правильный путь, но он работает.

  1. Установите в файле манифеста для основного действия android:launchMode = "singleTop".

  2. В основной деятельности в методе ocCreate():

     if ( !isTaskRoot() ){
         finish();
     }
    

Поэтому, если система откроет новую основную активность, нажав на виджет (taskId будет таким же) и поместит ее в верхнюю часть заднего стека, то просто завершите ее.

Это работает, но это хак. Смотрите мой ответ.

David Wasser 01.11.2022 15:10
Ответ принят как подходящий

Воспользуйтесь запуском Intent. Это просто выведет существующую задачу на передний план в любом состоянии, в котором она была. Если она еще не запущена, она запустится так же, как если бы пользователь коснулся значка приложения на ГЛАВНОМ экране:

remote_views.setOnClickPendingIntent( R.id.layout,
    PendingIntent.getActivity(
        context, 0,
        context.getPackageManager().getLaunchIntentForPackage("my.package.name"),
        PendingIntent.FLAG_IMMUTABLE ) );

Вам не нужен какой-либо специальный режим запуска в манифесте для вашего MainActivity.

Пожалуйста, измените на context.getPackageManager()

Style-7 02.11.2022 06:05

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