Как возобновить Android-активность программно из фона

Ситуация:

  1. Предположим, что в настоящее время я запускаю приложение Application A.
  2. Через некоторое время я нажимаю кнопку «Домой». Приложение A переходит на задний план.
  3. В это время я начинаю использовать другое приложение B – youtube, например, или т. Д.
  4. Что-то происходит (неважно, что в этом контексте, скажем, время окончания таймера) в приложении А, которое в настоящее время сводится к фону.
  5. При возникновении события приложение A автоматически возобновляется с фона.

Вопрос:

Как выполнить шаг 5? В основном мне нужно знать, как программно возобновить приложение на фоне.

Я попытался запустить намерение «перезапустить» мою активность приложения, но это не сработало:

Intent intent = new Intent(context, MainActivity.class); intent.setAction(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_LAUNCHER); context.startActivity(intent); 

Мой файл манифеста:

                                                     

Чтобы вывести приложение на передний план, вы должны вызвать startActivity() из другого контекста (либо Service либо BroadcastReceiver ). Просто вызов функции startActivity() из Activity не приведет ваше приложение на передний план.

Вам не нужны ACTION и CATEGORY в вашем Intent , но вам нужно установить Intent.FLAG_ACTIVITY_NEW_TASK .

Если ваши действия выполняются по разным задачам, вы можете использовать это для вывода задачи на передний план:

 ActivityManager activityManager = (ActivityManager) getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE); activityManager.moveTaskToFront(getTaskId(), ActivityManager.MOVE_TASK_NO_USER_ACTION); 

Для этого вам понадобится android.permission.REORDER_TASKS . Он работает даже в Android M, однако в некоторых случаях получение намерений от службы улучшается.

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

 Intent i = new Intent(MyService.this, MyActivity.class); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); MyService.this.startActivity(i); 

Ответ Дэвида Вассера помог решить мою проблему.

Моя активность запущена в Service переднего плана, поэтому мне пришлось вызвать startActivity() из этого контекста Service .

 Intent intent = new Intent(context, MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); mServiceContext.startActivity(intent); 

Возобновить приложение из фонового программного обеспечения будет

Сделайте свою деятельность FOREGROUND, текущую деятельность пользователя в области BACKGROUND. Работа пользователя GONE

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

Альтернатива:

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

Лучший способ сделать это, я думаю, через IntentService. Он тоже работает, и это, наверное, самый простой способ. Таким образом, последовательность: зарегистрируйте приемник в Activity (in onCreate), чтобы прослушать нужное событие, затем, когда получатель получает событие, он запускает IntentService стандартным способом, и это, в свою очередь, запускает Activity.
Таким образом, приложение будет размещено перед другими приложениями, как активными, так и скрытыми. (Но это следует использовать с осторожностью. Обычно пользователю не нравится, когда появляется другое приложение перед тем, с кем он работает, за исключением случаев, когда для этого есть веская причина.)
На моем устройстве KitKat (4.4.x) я протестировал его, и я могу перенести приложение на передний план, вызвав startActivity из получателя в Activity, только если нет открытого приложения , то есть мое приложение скрыто под домашним экраном. Тогда он будет на вершине. Если другое приложение открыто, даже если оно также скрыто (но перед моим приложением, я на самом деле не тестировал, чтобы узнать, что произойдет, если оба приложения будут скрыты, а мой – впереди, но это не очень важно), то он выиграл Если вы начнете из одной и той же Деятельности, вернитесь наверх. Поэтому, чтобы заставить его всегда всплывать, вам нужно использовать IntentService (или другим способом, но это насколько я знаю самый простой).

  • Как загрузить и сохранить изображение с помощью Google App Engine (java)
  • Как сериализовать объект в JSON?
  • ЗАПРОС, ОПРЕДЕЛЕННЫЙ с помощью API-интерфейса Google Адресов для веб-сервера, используемого в приложении для Android
  • Android: отправка данных> 20 байтов BLE
  • Как отправить данные из диалогового windows в fragment?
  • Что означает «| =»? (оператор равных труб)
  • Как сравнить два дата без временной части?
  • Можно ли использовать VectorDrawable в кнопках и TextViews с помощью android: DrawableRight?
  • Как открыть веб-браузер по умолчанию с помощью java
  • Поиск количества ядер в Java
  • Проверка сертификатов X509 с использованием Java APis
  • Давайте будем гением компьютера.