Delphi D10.X 安卓APP开发中按返回键后程序不退出程序的方法

在某些时候,我们会希望安卓下运行的程序不退出运行,当按下返回键后,程序退出前台但仍在后台运行,这里给出两个方法:

moveTaskToBack方法

使用方式:

procedure TfMain.FormKeyUp(Sender: TObject; var Key: Word; var KeyChar: Char;
Shift: TShiftState);
begin
{$IFDEF ANDROID}
  if Key = vkHardwareBack then
  begin
    Key := 0;
    TAndroidHelper.Activity.moveTaskToBack(False);
  end;
{$ENDIF}
end;

首先通过 Key = vkHardwareBack判断是否按下的是返回键,如果是,则先把键值设置为0。其次使用moveTaskToBack(False)让程序退出前台显示,到后台继续运行。
函数:
function moveTaskToBack(nonRoot: Boolean): Boolean; cdecl;
其中参数nonRoot表示:
false——只有当前activity是task根,也就是应用启动的第一个activity时,才有效;
true——则忽略这个限制,任何activity都可以有效。
在Delphi里可以忽略这个参数的意义,直接使用False就行了。

模拟Home按键法

使用方式:

procedure TfMain.FormKeyUp(Sender: TObject; var Key: Word; var KeyChar: Char;
Shift: TShiftState);
{$IFDEF ANDROID}
var
  intent: JIntent;
{$ENDIF}
begin
{$IFDEF ANDROID}
  if Key = vkHardwareBack then
  begin
    Key := 0;
    intent := TJIntent.Create;
    intent.setAction(TJIntent.JavaClass.ACTION_MAIN);
    intent.setFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);
    intent.addCategory(TJIntent.JavaClass.CATEGORY_HOME);
    TAndroidHelper.Context.startActivity(intent);
  end;
{$ENDIF}
end;

这种方式需要使用到意图,同样先检测是否按下了返回键,设置按健值为0.
然后使用意图模拟发送Home,让程序退出前台运行。

需要说明的

这两种方式都可以让程序不关闭的情况下退出前台到后台运行,但并不是说APP应用在后台就可以长时间运行。退到后台后,android系统不会马上关闭这些后台的App应用,而是在系统认为合适的时候,才会去关闭它,比如系统发现手机内存不够了,或是符合手机省电模式规则需要关闭时。

相关文章导读

Delphi D10.X安卓开发中按两次返回键退出系统的方法
Delphi D10.X安卓APP开发中简单使用原生Toast
点击上面标题后直接查看


 欢迎光顾本人小店:(https://shop63778938.taobao.com/) 
 小店也提供delphi方面其他技术支持、定制开发。   

现在就进店看看

大家有什么不清楚的,可以给我留言讨论
以上信息对您有用的话请点赞收藏,就下面这行

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用Delphi编写的简单的RS485程序示例: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Label1: TLabel; Edit1: TEdit; Button1: TButton; Memo1: TMemo; procedure Button1Click(Sender: TObject); private { Private declarations } ComPortHandle: THandle; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var Data: array[0..255] of Byte; BytesRead: DWORD; i: Integer; begin // 打开串口 ComPortHandle := CreateFile('COM1', GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if ComPortHandle = INVALID_HANDLE_VALUE then begin ShowMessage('无法打开串口'); Exit; end; // 设置串口参数 DCB.dcbLength := SizeOf(DCB); GetCommState(ComPortHandle, DCB); DCB.BaudRate := 9600; DCB.Parity := NOPARITY; DCB.ByteSize := 8; DCB.StopBits := ONESTOPBIT; SetCommState(ComPortHandle, DCB); // 发送数据 Data[0] := $01; // 设备地址 Data[1] := $03; // 功能码 Data[2] := $00; // 寄存器地址高位 Data[3] := $00; // 寄存器地址低位 Data[4] := $00; // 寄存器数量高位 Data[5] := $01; // 寄存器数量低位 WriteFile(ComPortHandle, Data, 6, BytesRead, nil); // 读取响应数据 Sleep(100); // 等待一段时间,确保数据已经准备好 ReadFile(ComPortHandle, Data, 255, BytesRead, nil); for i := 0 to BytesRead - 1 do Memo1.Lines.Add(IntToHex(Data[i], 2)); // 关闭串口 CloseHandle(ComPortHandle); end; end. 在上面的代码,我们使用了Windows API函数CreateFile、GetCommState、SetCommState、WriteFile和ReadFile来访问串口。在实际应用,我们需要根据实际情况修改串口的参数和发送的数据,以及处理接收到的响应数据。需要注意的是,在使用串口时,我们需要先打开串口,设置串口参数,发送数据,然后再读取响应数据,最后关闭串口。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值