3

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 は発生しません。そのため、タブレットですぐにコードをテストする必要があり、時間がかかります。残念。

4

2 に答える 2