如何在Delphi 10.1 下探测Android Home键按下等用户行为

本文介绍了一种在Android设备上监听Home键的方法,通过创建ReceiverListener类并实现onReceive方法,可以捕获到ACTION_CLOSE_SYSTEM_DIALOGS的动作,从而响应Home键的按下事件。

       我们都知道对于Android设备,接收来自遥控器的按键分为两种,一种是普通按键,比如:上、下、左、右、返回、ok,这些按键可以直接利用Form的OnKeyUp事件探测到;另外还有一种是热键,像Home键,而这种按键消息无法通过OnKeyUp探测到。

       最近因为项目需要,着重研究了这块,经过搜索和总结尝试,现将方法记录如下,以供自己和有同样需求的朋友参考使用。注:代码是在Delphi 10.1的IDE下编译测试的,其他版本暂未测试。

 首先,实现ReceiverListener类:

unit MyReceiver;

interface
uses
  FMX.Types,
  Androidapi.JNIBridge,
  Androidapi.JNI.Embarcadero,
  Androidapi.JNI.GraphicsContentViewText;

type
  TMyReceiver = class(TJavaLocal, JFMXBroadcastReceiverListener)
  public
    constructor Create;
    procedure onReceive(context: JContext; intent: JIntent); cdecl;
  end;



implementation
uses
  Androidapi.Helpers,
  Androidapi.JNI.JavaTypes;


{ TMyReceiver }

constructor TMyReceiver.Create;
begin
  inherited;
end;

procedure TMyReceiver.onReceive(context: JContext; intent: JIntent);
begin
  Log.d('Broadcast Received = ' + JStringToString(intent.getAction));
  Log.d('Reason = ' + JStringToString(intent.getStringExtra(StringToJString('reason'))));
end;

其次,添加侦听,按下Home键的消息为:ACTION_CLOSE_SYSTEM_DIALOGS

unit Unit1;

interface
uses
   MyReceiver,
   Androidapi.JNI.Embarcadero,
   Androidapi.JNI.GraphicsContentViewText
  ,Androidapi.Helpers;

type
  TForm1 = class(TForm)
      procedure FormCreate(Sender: TObject);
    private
      FMyListener: TMyReceiver;
      FBroadcastReceiver: JFMXBroadcastReceiver;
  end;

implementation

{$R *.fmx}
procedure TForm1.FormCreate(Sender: TObject);
var
   Filter: JIntentFilter;
begin
  {$IFDEF Android}
   FMyListener := TMyReceiver.Create;
   FBroadcastReceiver := TJFMXBroadcastReceiver.JavaClass.init(FMyListener);

   Filter := TJIntentFilter.JavaClass.init;
   //Filter.addAction(TJIntent.JavaClass.ACTION_SCREEN_OFF);
   //Filter.addAction(TJIntent.JavaClass.ACTION_SCREEN_ON);
   Filter.addAction(TJIntent.JavaClass.ACTION_CLOSE_SYSTEM_DIALOGS);
   TAndroidHelper.context.getApplicationContext.registerReceiver
      (FBroadcastReceiver, Filter);
  {$ENDIF}
end;

最后,打开Android Device Monitor,查看输出。 当按下Home键的时候,输出如下:

Broadcast Received = android.intent.action.CLOSE_SYSTEM_DIALOGS

Reason = homekey

当然ReceiverListener还支持其他动作行为的监听。

整理完毕!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值