В моем приложении есть фоновая служба (Android), которая периодически ищет новые данные. Если появляются новые данные, начинается уведомление. При нажатии на уведомление запускается небольшая часть собственного кода, и это возвращает приложение Nativescript вперед.
Фрагмент из класса Kotlin для возврата приложения Nativescript:
val launchIntent: Intent? = packageManager.getLaunchIntentForPackage(applicationContext.packageName)
launchIntent?.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT or Intent.FLAG_ACTIVITY_SINGLE_TOP)
launchIntent?.setAction(ACTION_NOTIFICATION_AVAILABLE)
startActivity(launchIntent)
В классе AppComponent
мой слушатель для AndroidApplication.activityResumedEvent
будет слушать:
export class AppComponent implements OnInit {
constructor(
private router: Router,
private ngZone: NgZone,
) {}
ngOnInit(): void {
android.on(AndroidApplication.activityResumedEvent, (args) => this.ngZone.run(() => {
let intent = args.activity.getIntent();
if (intent.getAction() === com.sample.app.NotificationTapReceiver.ACTION_NOTIFICATION_AVAILABLE) {
this.router.navigate(['/notificationList']);
}
}));
}
}
В большинстве случаев этот код работает в соответствии с требованиями. Но, по моему мнению, у нас есть три разные ситуации:
- Приложение находится на переднем плане и работает, когда уведомление приходит и пользователь нажимает на него. => все отлично работает
- Приложение не работает только в фоновом режиме. Если пользователь коснется уведомления, приложение полностью запустится и перейдет в список уведомлений. => все работает нормально
- Проблема: приложение работает, но не на переднем плане. Нажав на уведомление, приложение возобновляет работу (без перезапуска) вперед и переходит к списку уведомлений , но пользовательский интерфейс останавливается . При нажатии элементов на экране запускается внутренний код (
consoloe.log(...)
), но никаких действий в интерфейсе. Может быть, пользовательский интерфейс не зависает, только маршрутизация / навигация не работают.
Я нахожу вопрос Nativescript - Как вывести приложение на передний план при нажатии уведомления , но в моем В случае, если нет разницы между android эмулятором и (не подключенным) реальным android устройством.
Тесты с флагами для запуска действия изменят поведение, но не в правильном направлении
# FLAG_ACTIVITY_SINGLE_TOP might be the best solution but the described error above is very annoying
launchIntent?.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT or Intent.FLAG_ACTIVITY_SINGLE_TOP)
# even the app is in foreground after a tap on the notification the app is fully restarts
launchIntent?.addFlags(FLAG_ACTIVITY_NEW_TASK)
Кто-нибудь знает, где проблема или какие флаги мне нужно установить, чтобы предотвратить текущее состояние и полностью рабочий интерфейс (с маршрутизатором / навигацией)? Или мне нужно изменить код nativescript / angular, чтобы лучше обрабатывать событие возобновления?
Не лучшее решение, но когда я смог обрезать флаги, чтобы приложение, работающее на переднем плане, все еще работало и в двух других состояниях (приложение не работает или приложение в фоновом режиме) инициируется полный перезапуск, в данный момент это тоже будет хорошо.
Обновление: похоже, что пользовательский интерфейс не завис. Я добавил RadListView и могу прокрутить список, но маршрутизация / навигация не работают. Даже я использую this.routerExtensions.back()
и не использую this.router.navigate(['notificationDetail'])
.