Есть ли способ избежать событий жизненного цикла действий nativescript, которые будут вызваны более одного раза - PullRequest
0 голосов
/ 04 июля 2019

Я пытаюсь обработать жизненный цикл Android в моем приложении NativeScript для Android, используя следующее руководство: https://docs.nativescript.org/core-concepts/application-lifecycle#android-activity-events

Когда я использую кнопку «Назад», чтобы выйти из приложения, а затем кнопку «Недавние», чтобы снова открыть приложение, все события жизненного цикла запускаются дважды. Если я сделаю это снова, все события жизненного цикла сработают трижды.

Вот простое приложение для детской площадки, которое показывает проблему: https://play.nativescript.org/?template=play-ng&id=y9RucD

Используйте кнопку «Назад», а затем последнюю кнопку, чтобы возобновить ...

1 Ответ

0 голосов
/ 10 июля 2019

Вам нужно удалить слушателей на событие уничтожения.Поскольку вы используете android.on для назначения прослушивателей событий, вам также необходимо использовать android.off.

Вы можете найти полный пример здесь и здесь .Я также обновил вашу игровую площадку .

В вашей функции ngOnInit я назначаю android.on слушателю, например,

this.launchListenerCB = (args) => {
            console.log(">>>>>>> resumeEvent Event");
            if (args.android) {
                // For Android applications, args.android is an android.content.Intent class.
                console.log("resumeEvent Android application with the following intent: " + args.android + ".");
            }
        };

        appOn(resumeEvent, this.launchListenerCB);

и на exitEvent я отписываюсьвсе слушатели.

this.exitListenerCB = (eventData: any) => {

            this.unsubscribeAll();
        }
        appOn(exitEvent, this.exitListenerCB);



private unsubscribeAll(): void {
        // console.log("unsubscribeAll launchListenerCB:", !!launchListenerCB)

        appOff(resumeEvent, this.launchListenerCB); // HERE
        // appOff(suspendEvent, this.suspendListenerCB);
        // appOff(resumeEvent, this.resumeListenerCB);
        // appOff(lowMemoryEvent, this.lowMemoryListenerCB);
        // appOff(exitEvent, this.exitListenerCB);
    }

На вашей игровой площадке я только что использовал ResumeEvent, чтобы показать вам код, который вы также можете назначать / отменять для других событий.

...