在Android里,用java通过实现BroadcastReceiver接口,就可以获得Intent消息。可是Delphi程序不能直接实现JBroadcastReceiver,如何能够实现类似Java的BroadcastReceiver功能呢?
幸运的是Delphi提供了TJFMXBroadcastReceiver类实现了BroadcastReceiver,我们便可以以此达到目的。
下面的程序片段举例,实现如何在Delphi下获取USB外设拔插的消息。
uses System.SysUtils, System.Classes,System.Generics.Collections,Androidapi.JNI.USB,Androidapi.JNI.Embarcadero,Androidapi.JNIBridge,Androidapi.JNI.GraphicsContentViewText,Androidapi.JNI.JavaTypes,Androidapi.JNI.App,Androidapi.JNI.os,...;TUsbFtdiBroadcastReceiverListener = class(TJavaLocal, JFMXBroadcastReceiverListener)private[Weak] FPort: TFTDIPort;publicconstructor Create(const Owner: TFTDIPort);procedure onReceive(context: JContext; intent: JIntent); cdecl;end;TFTDIPort = class(TInterfacedObject, ICommPort)protectedclass var FManager: JD2xxManager;class var FListener : TUsbFtdiBroadcastReceiverListener;class var FReceiver: JFMXBroadcastReceiver;class var FUsbManager:JUsbManager;class var FFilter:JIntentFilter;class procedure InitClass(Port:TFtdiPort);publicfunction Connect(Device : String): Boolean;procedure Disconnect;...... end;{ TUsbFtdiBroadcastReceiverListener } constACTION_USB_PERMISSION='com.android.example.USB_PERMISSION';constructor TUsbFtdiBroadcastReceiverListener.Create(const Owner: TFtdiPort); begininherited Create;FPort:=Owner; end;procedure TUsbFtdiBroadcastReceiverListener.onReceive(context: JContext;intent: JIntent); varaction:String;Accessory:JUsbAccessory; beginaction:=JStringToString(intent.getAction);if action=ACTION_USB_PERMISSION thenbeginif (intent.getBooleanExtra(TJUsbManager.JavaClass.EXTRA_PERMISSION_GRANTED, False)) thenbeginAccessory:= TJUsbAccessory.Wrap(intent.getParcelableExtra(TJUsbManager.JavaClass.EXTRA_ACCESSORY));if JStringToString(Accessory.getManufacturer)='FTDI' thenbeginFPort.Connect(JStringToString(Accessory.toString));end;end;endelse if (action=TJUsbManager_ACTION_USB_DEVICE_DETACHED) thenbeginFPort.Disconnect;endelsebeginend; end;class procedure TFtdiPort.InitClass(Port:TFdiPort); beginif not Assigned(FUsbManager) thenbeginFUsbManager := TJUsbManager.Wrap(SharedActivityContext.getSystemService(TJContext.JavaClass.USB_SERVICE));if not Assigned(FUsbManager) then Exit;FListener := TUsbFtdiBroadcastReceiverListener.Create(Port);if not Assigned(FListener) then Exit;FReceiver := TJFMXBroadcastReceiver.JavaClass.init(FListener);if not Assigned(FReceiver) then Exit;FFilter:=TJIntentFilter.JavaClass.init(StringToJString(ACTION_USB_PERMISSION));if not Assigned(FFilter) then Exit;FFilter.addAction(TJUsbManager.JavaClass.ACTION_USB_ACCESSORY_DETACHED);SharedActivityContext.registerReceiver(FReceiver, FFilter);end; end;