如何以编程方式为 android 重启应用程序?

How to restart an app programmatically for android?

首先,我对重启应用程序略知一二。但那是 windows 的时候。在这种情况下,我需要为来自 android 的应用程序制作此文件。我找不到适用于 Delphi 的解决方案。刚刚从@Mihai Limbăşan 找到这个我引用:

Perhaps you should think outside the box. Instead of futzing with the mutex/instance logic, you could simply create another executable that waits for your app to close then starts it again. As an added bonus, you can later use this mechanism to, for example, update some of your main app's binaries. It's also much easier to run it elevated instead of maintaining different integrity levels inside the same app, etc.

但不知道这是如何工作的,甚至不知道从哪里开始... 我们将不胜感激每条提示、代码示例或其他重启应用程序的解决方案。

编辑

在一些问题之后,这里是程序中的一些代码片段。

首先。 在您选择例如“英语”语言并按下按钮保存后,就会发生这种情况

  Inifile := TIniFile.Create(fPath);
  try
  Inifile.WriteString('Instelling','ip',edit5.text);
  Inifile.WriteString('Instelling','user',edit6.text);
  Inifile.WriteString('Instelling','pixels',edit3.text);
  Inifile.WriteInteger('Instelling','language',Combobox2.ItemIndex);
  fGebruiker := Edit6.Text;
  fFotoformaat := StrToInt(edit3.Text);
  finally
  FDConnection1.Params.Values['server']:=edit5.Text;
  FDConnection1.Connected := True;
  inifile.free;
  End;

使用这段代码,我用数据填充了一个 ini 文件,您还可以看到该语言的组合框的项目索引。

在这一点上,我手动重新启动应用程序,以便通过此代码选择正确的语言:

procedure TfmMain.FormShow(Sender: TObject);
VAR
param : string;
inifile : tInifile;
begin
 


if (System.SysUtils.fileexists(fPath)) then
     Begin

         begin
          Inifile := TIniFile.Create(fPath);

              try
              if not (Inifile.ReadString('Instelling','ip','default')='default') and not (Inifile.ReadString('Instelling','Gebruiker','default')='default')then
                try

                edit5.text := Inifile.ReadString('Instelling','ip','default');
                edit6.text := Inifile.ReadString('Instelling','user','default');
                Edit3.text := Inifile.ReadString('Instelling','pixel','400');
                combobox2.ItemIndex := IniFile.ReadInteger('Instelling','language',1);
                fpixel:= StrToInt(edit3.Text);
                fuser:=edit6.text;
                FDConnection1.Params.Values['server']:=edit5.Text;
                 taal := 'NL';


                //find language settings
                  if combobox2.ItemIndex=0 then
                  begin
                    language:= 'NL'
                  end;

                  if combobox2.ItemIndex=1 then
                  begin
                    language:= 'ENG';
                  end;

                 if language='ENG' then
                 begin
                 vertalerENG.vertaler('ENG');
                 end;
              end;
            end;
         end;
      end;

VertalerENG 是一个函数,如果语言参数为 ENG 并将所有字幕更改为英语,则会触发该函数。

问题是在我重新启动应用程序之前没有任何改变。

如果更改语言是您唯一关心的问题,那么我建议更改应用程序的区域设置。如果您正确使用 strings.xml

中的所有字符串,则只需要重新启动 activity

您可以在此处查看如何以编程方式更改应用程序的语言环境。

Change app language programmatically in Android

如果您想以编程方式重启应用程序, 这段代码对我来说很好用,你可以在重启应用程序之前设置经过的时间

uses
Androidapi.Helpers,Androidapi.JNI.GraphicsContentViewText,Androidapi.JNI.App,
System.DateUtils;
...

procedure RestartApp;
     {$IFDEF ANDROID}
    var  LPM : JPackageManager;
      LIntent_Start : JIntent;
      LPendingIntent : JPendingIntent;
      LMS : Int64;
     {$ENDIF}
begin
    {$IFDEF ANDROID}
      LPM := TAndroidHelper.Context.getPackageManager();
      LIntent_Start := LPM.getLaunchIntentForPackage(
          TAndroidHelper.Context.getPackageName()
          );
      LIntent_Start.addFlags( TJIntent.JavaClass.FLAG_ACTIVITY_CLEAR_TOP );
    
      LPendingIntent := TJPendingIntent.JavaClass.getActivity(
          TAndroidHelper.Context,
          223344 {RequestCode},
          LIntent_Start,
          TJPendingIntent.JavaClass.FLAG_CANCEL_CURRENT
          );
      LMS := DateTimeToUnix( Now, False {InputIsUTC} ) * 1000;
    
      TAndroidHelper.AlarmManager.&set(
          TJAlarmManager.JavaClass.RTC,
          LMS + 10000,
          LPendingIntent
          );
          // TAndroidHelper.Activity.finish();
        Application.Terminate;
    {$ENDIF }
end;