Windows プログラムが終了すると、OnClose、OnDestroy、デストラクタ Destroy などのイベント ハンドラが呼び出されます。いくつかの INI 設定を保存したい場合は、これらの場所に保存します。これらすべてのイベントのイベント ハンドラーを作成しましたが、プログラムを終了しても処理されません。
Android プログラムの終了時に実行するコードをどこに配置すればよいか知っている人はいますか? これはiOSにも当てはまると強く思います。
アップデート
ヨハンの答えは Android でも機能しますが、現実は彼の例よりも少し複雑です。良かったのは、これまで聞いたことのない TApplicationEvents に強制的に参加させられたことです。カスタムは Embarcadero によって文書化されていませんが、FMX.Platform のコードは十分に興味深いものです。aeEnteredBackground、aeWillBecomeInactive、および aeWillTerminate の 3 つが興味深いと思われるいくつかの ApplicationEvents が定義されています。それらは文書化されていないので、私は彼らがその名前が示唆することをしたと推測しました: バックグラウンド状態に達したこと、バックグラウンドへの移行を開始し、(非常に) すぐに終了することを通知します。Johan のコードを次のように変更しました。
function TForm2.AppEvent (AAppEvent: TApplicationEvent; AContext: TObject) : Boolean;
begin
// do something here for when the app is sent to background
case AAppEvent of
(1) TApplicationEvent.aeEnteredBackground: ;// Something for OnDeactivated
// which does not exist
(2) TApplicationEvent.aeWillBecomeInactive: if Assigned (OnDeactivate)
then OnDeactivate (Self);
(3) TApplicationEvent.aeWillTerminate: if Assigned (OnClose)
then OnClose (Self);
end; // case
Result := True; // let iOS/Android know it worked...
end; // AppEvent //
イベント 1、2、および 3 にラベルを付けると、デバッガーを使用した実験で次のことが示されました。アプリケーションを強制的にバックグラウンドにすると、2、1、1、2 という一連のイベントが生成されます。 2, 2. コードを 1 回実行する必要がある場合は、予防策を講じてください。しかし、より良いのは: aeWillTerminate は、それがアドバタイズすることを行います: アプリケーションが終了したときにシグナルを送信します。これを行う時間はおそらく短いので、TIniFile を作成するだけで十分かどうかをテストします。
このコードを Win32 でも試しましたが、うまくいきません。AppEvent は発生しません。そのため、タブレットですぐにコードをテストする必要があり、時間がかかります。残念。