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

Уведомление о восстановлении задачи, а не конкретной деятельности?

У меня есть служба переднего плана, которая поддерживает соединение с сервером, пока пользователь входит в приложение. Это связано с тем, что соединение поддерживается в режиме реального времени и может получать сообщения непосредственно с сервера, даже когда приложение было отправлено в фоновое изображение, нажав кнопку "Домой".

В приложении есть несколько Деяний, любой из которых может быть активным, когда он отправляется в фоновый режим.

Я хотел бы разрешить пользователю щелкнуть уведомление, чтобы восстановить текущую активность. Я понимаю, как восстановить конкретную активность, но задался вопросом, есть ли способ восстановить последнее действие, в котором находился пользователь? Конечно, я мог бы отслеживать последний, а затем вызывать это из обратного вызова Notification, но думал, что может быть способ на уровне задачи?

Спасибо за любые советы, которые вы можете предложить.

4b9b3361

Ответ 1

То, что вам нужно, это просто простая операция, которая ничего не делает. Вот пример:

public class NotificationActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Now finish, which will drop the user in to the activity that was at the top
        //  of the task stack
        finish();
    }
}

Настройте уведомление, чтобы начать эту операцию. Убедитесь, что в манифесте близость задачи к этому действию совпадает с близостью задачи к другим действиям в вашем приложении (по умолчанию это означает, что если вы явно не задали android: taskAffinity),.

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

Это не будет работать, если ваше приложение еще не запущено. Однако у вас есть два варианта:

  • Убедитесь, что уведомление отсутствует на панели уведомлений, когда ваше приложение не запущено.

  • В методе onCreate() NotificationActivity проверьте, запущено ли ваше приложение, и если он не запускает вызов startActivity() и запускает ваше приложение. Если вы сделаете это, убедитесь, что при запуске приложения установите флаг Intent.FLAG_ACTIVITY_NEW_TASK, чтобы корневая активность задачи не была NotificationActivity.

Ответ 2

Хорошо работает, спасибо Дэвиду! Следующий класс проверяет, запущено ли приложение, а если нет, запускает его перед завершением (как было предложено Дэвидом в варианте 2).

public class NotificationActivity extends Activity 
{
    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);

        // If this activity is the root activity of the task, the app is not running
        if (isTaskRoot())
        {
            // Start the app before finishing
            Intent startAppIntent = new Intent(getApplicationContext(), MainActivity.class);
            startAppIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(startAppIntent);
        }

        finish();
    }
}

Ответ 3

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

Ответ 4

Мое решение, которое эмулирует поведение пусковой установки (восхождение задачи на передний план):

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setClassName(MyApplication.class.getPackage().getName(), MainActivity.class.getName());

Ответ 5

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);

Это не вызывает сомнений, но проблема заключается в том, что вы устанавливаете свое намерение как ACTION_MAIN. Тогда вы не сможете установить какой-либо комплект для намерения. Я имею в виду, что ваши примитивные данные не будут получены из целевой активности, потому что ACTION_MAIN не может содержать никаких дополнительных данных.

Вместо этого вы можете просто настроить свои действия как singleTask и называть свое намерение обычно, не устанавливая ACTION_MAIN и не получая намерение от метода onNewIntent() целевой активности.

Но будьте внимательны, если вы вызываете, super.onNewIntent(намерение); то будет создан второй экземпляр действия. Просто не называйте супер метод.