Nativescript + Angular Пользовательский интерфейс завис после возврата из фона на Android - PullRequest
0 голосов
/ 28 апреля 2020

В моем приложении есть фоновая служба (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']).

...