我们都知道对于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还支持其他动作行为的监听。
整理完毕!
本文介绍了一种在Android设备上监听Home键的方法,通过创建ReceiverListener类并实现onReceive方法,可以捕获到ACTION_CLOSE_SYSTEM_DIALOGS的动作,从而响应Home键的按下事件。

1万+

被折叠的 条评论
为什么被折叠?



