Щелчок по значку запуска Android запускает новое действие ТОЛЬКО, если оно выдается после запуска этого действия из уведомления.

Запуск активности путем нажатия на значок приложения в панели запуска должен вывести активность на передний план, как если бы она была выбрана из истории. Таким образом, вызов onCreate не должен существовать.

Однако, если мы попытаемся сделать это после запуска действия, щелкнув уведомление, тогда программа запуска просто запустит другой экземпляр действия.

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

Я опубликую основной код.

Это запускает уведомление:

Intent resumeIntent = new Intent(this, MainActivity.class);
PendingIntent resumePendingIntent = PendingIntent.getActivity(this, 2,
        resumeIntent, PendingIntent.FLAG_UPDATE_CURRENT);

Notification resumeNotification = new Notification.Builder(this).setContentTitle(
        "Resume style")
        .setSmallIcon(R.drawable.ic_launcher)
        .setContentIntent(resumePendingIntent)
        .build();

NotificationManager notificationManager = (NotificationManager) getSystemService(Service.NOTIFICATION_SERVICE);
notificationManager.notify(1, launcherNotification);

Вот как выглядит активность манифеста:

    <activity
        android:name="com.example.ihatenotifiicationsapp.MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

Это резюмеIntent будет автоматически добавлено Android в FLAG_ACTIVITY_NEW_TASK. Этот флаг разрешает возобновление работы приложения из фона, если он присутствует.

До сих пор все было хорошо, но если после того, как вы щелкнете это уведомление и возобновите работу приложения, вы щелкнете приложение из панели запуска, Android запустит еще один экземпляр MainActivity.

Это ломает мое приложение и задний стек (у вас будет 2 MainActivity в стеке, что странно для пользователя).

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


person aureliangtx    schedule 22.10.2013    source источник


Ответы (2)


Вы можете использовать флаг android:launchMode="singleTask" в теге activity, если хотите такого поведения. Это предотвращает запуск ОС любого другого экземпляра, если в данный момент есть один активный экземпляр. См. SDK Doku для получения дополнительной информации о запусках здесь

Я отредактировал этот ответ, соответствующий комментарию Эмануэля Моклина ниже. Перепутал режимы запуска.

Выдержка из Доку:

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

person chuck258    schedule 22.10.2013
comment
singleInstance — это не то, что вам обычно нужно. Действие, запущенное как один экземпляр, стоит отдельно как единственное действие в своей задаче. Если он запускает другое действие, это действие будет запущено в другой задаче независимо от режима его запуска — как если бы FLAG_ACTIVITY_NEW_TASK был в намерении. Обычно вы предпочитаете singleTask. - person Emanuel Moecklin; 22.10.2013
comment
singleTask может быть решением, но с ним есть 1 большая проблема: если вы хотите запустить приложение, как это было бы с лаунчером (восстановить пользователя до последнего использовавшегося действия, используя ACTION_MAIN и CATEGORY.LAUNCHER), то вы вышли удачи. Использование стандартного launchMode позволяет это сделать - person aureliangtx; 22.10.2013

Пытаться

Intent resumeIntent = new Intent(this, MainActivity.class)
                         .setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP;

Если установлено, и запускаемое действие уже выполняется в текущей задаче, то вместо запуска нового экземпляра этого действия все другие действия поверх него будут закрыты, и это намерение будет доставлено в (сейчас на вверху) старая деятельность как новое намерение. http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_CLEAR_TOP

person Emanuel Moecklin    schedule 22.10.2013
comment
попробовал это, все равно запускается новый экземпляр. Это похоже на то, как после нажатия на уведомление среда выполнения Android не видит, что ваше приложение запущено, и просто запускает другое, если щелкнуть на панели запуска. - person aureliangtx; 22.10.2013