2016-09-24 4 views
1

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

Обычно приложение должно немедленно закрываться, но иногда выполняются некоторые фоновые задачи, которые не закрываются сразу (например, http-соединение, файл при записи на диск и т. Д.). Их способ не заботиться ни о чем и вряд ли закрыть приложение?

+0

Возможный дубликат [Как закрыть приложение Android в приложении Delphi-XE5 Firemonkey?] (Http: // stackoverflow.com/questions/19234502/how-to-close-android-app-in-delphi-xe5-firemonkey-application) –

+0

Я посмотрю, особенно по предложению SharedActivity.finish :) спасибо Джерри – loki

+0

я не понимаю что-нибудь, я скомпилирую class.dex, используя инфраструктуру Api 23, и теперь приложение закрывается (вряд ли близко - не ждите ничего), даже если у них работает фоновая задача :(Теперь хороший вопрос, какие настройки делают приложение едва закрытым? i просто скомпилируйте class.dex с помощью Api 23 и используйте @android: style/Theme.Material.Light.NoActionBar как тема – loki

ответ

2

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

Похоже, что Application.Terminate является «официальным способом», по крайней мере, в более поздних версиях Delphi. Глядя на реализацию в TPlatformAndroid.Terminate, он делает то, что должно быть сделано при закрытии.

Обратите внимание, что в XE5 (включая пакет обновления) метод TPlatformAndroid.Terminate был пуст. В Delphi XE6-XE8 есть основы установки IFMXApplicationService.Terminating на True, завершение таймеров и инструктирование основной активности на завершение с вызовом ANativeActivity_finish. Delphi 10 Сиэтл добавил к этому, вызывая TForm.OnSaveState и Delphi 10.1 Berlin предпринимает шаги для обеспечения безопасного выполнения этого кода в потоке FMX.

Есть другие варианты, некоторые из которых имеют различные недостатки. Недостатком некоторых, казалось бы, очевидных кандидатов является производство ошибок во время выполнения (· _ ·,)

Во всяком случае, вы можете попробовать эти варианты, если вы хотите:

  • вызов, Close метод главной формы -> кажется, работает в последних версиях
  • вызов Release метод главной формы -> производит EListError с сообщением Несбалансированное стека или очереди операции если вызывается из основной метод формы благодаря заметному различию между поведением и реализации Release на ОС Windowsи на Android
  • вызова DisposeOf против основной формы -> производит нарушение прав доступа, если вызывается из обработчика события, благодаря его непосредственной Efect - как правило, не очень хороший результат
  • Вызовите finish метод базового Android деятельности по телефону TAndroidHelper.Activity.finish (который полагается на блок Androidapi.Helpers) или MainActivity.finish (который полагается на модуль FMX.Platform.Android) -> кажется, работает
  • звонок Halt -> это самый абразивный способ прекратить ваше приложение, которое не рекомендуется: приложение внезапно завершит обход любого важного кода очистки и т. д.
  • call kill(getpid, SIGKILL) после использования методов Posix.Pthread, Posix.Unistd и Posix.Signal -> еще один чрезвычайно абразивный метод (возможно, самый абразивный), который не рекомендуется: приложение внезапно прекратится в обход любого важного кода очистки и т. Д.
+0

Да, извините, мой английский когда-то очень плох :(Я имею в виду, как вы понимаете, вынужден закрыть. Но, как я уже сказал, прямо сейчас, когда я закрываю основную форму, это точно так же, как делать «остановку» :(я не могу понять почему ... но так или иначе, поскольку андроид неисправен, приложение не должно занимать больше 1 с, чтобы закрыть (иначе андроид-сбой, если вы снова запустите приложение, когда он все еще находится в процессе закрытия), и таким образом принудительное закрытие не очень плохой выбор (но мне хотелось бы знать, почему вдруг теперь он закрыл силу, я буду исследовать глубже, я думаю, это возможно потому, что я компилирую classes.dex, используя api 23) – loki

+1

Есть много подводных камней на английском языке для тех, кто не интимный с этим и много для тех, кто есть. Этот пример - вполне понятный случай благодаря нескольким противоположным определениям, основанным на контексте. В любом случае, когда вы закрываете основную форму, вызывается 'Application.Terminate', что завершает приложение. взглядами 'TPlatformA ndroid.Terminate'. Если это происходит, когда кто-то нажимает кнопку «Назад» в основной форме, вы можете поймать эту кнопку назад и настроить 5-секундный таймер, закрыть вещи dow0 в главном коде и вызвать таймер 'Application.Terminate'. Это может дать время. – blong

Смежные вопросы