Intereting Posts
Удаление Apache HTTP Client из API23, повлияет ли это на Volley? Android, ссылки на вещи в R.drawable. Используя переменные? Как получить имя файла и реальный путь к файлу диска Google? Как показать Spinner With Label (Статический текст)? Запустить программу андроида как root Как сделать любой цветной код html полупрозрачным Как добавить разделители между определенными пунктами меню? Остановка и запуск музыки при входящих вызовах Прохождение layout_weight ссылки из измерений (размеры) Как включить динамик для входящего вызова программно в Android L? ListFragment onPrepareOptionsMenu вызывается перед onCreate. Почему и как исправить / обходить? Можем ли мы удалить неиспользуемые приложения из Google Play? Исключение для Android: вам нужно использовать тему Theme.AppCompat с этой деятельностью Позиционирование изображения внутри ImageView с помощью силы тяжести: верх Android – java.lang.SecurityException: отказ от разрешения: начало работы

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

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

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

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

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

Solutions Collecting From Web of "Уведомление о восстановлении задачи, а не конкретной деятельности?"

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

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

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

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

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

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

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

Работает очень хорошо, спасибо Дэвиду! Следующий класс проверяет, запущено ли приложение, а если нет, запускает его перед завершением (как было предложено Дэвидом в варианте 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(); } } 

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

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

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

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

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

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