http://blog.sina.com.cn/s/blog_44fa172f0102vwr2.html
直接上代码,还有条经验就是SetApplicationEventHandler可注册多个事件方法。
unit Unit6;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo, FMX.Platform;
type
TForm6 = class(TForm)
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
private
function HandleAppEvent(AAppEvent: TApplicationEvent;
AContext: TObject): Boolean;
{ Private declarations }
public
{ Public declarations }
end;
var
Form6: TForm6;
implementation
{$R *.fmx}
procedure TForm6.FormCreate(Sender: TObject);
var
SvcEvents: IFMXApplicationEventService;
begin
if TPlatformServices.Current.SupportsPlatformService
(IFMXApplicationEventService, IInterface(SvcEvents))
then
SvcEvents.SetApplicationEventHandler(HandleAppEvent);
end;
function TForm6.HandleAppEvent(AAppEvent: TApplicationEvent; AContext: TObject): Boolean;
var
astate: string;
begin
case AAppEvent of
TApplicationEvent.FinishedLaunching:
astate := 'FinishedLaunching';
TApplicationEvent.BecameActive:
astate := 'BecameActive';
TApplicationEvent.WillBecomeInactive:
astate := 'WillBecomeInactive';
TApplicationEvent.EnteredBackground:
astate := 'EnteredBackground';
TApplicationEvent.WillBecomeForeground:
astate := 'WillBecomeForeground';
TApplicationEvent.WillTerminate:
astate := 'WillTerminate';
TApplicationEvent.LowMemory:
astate := 'LowMemory';
TApplicationEvent.TimeChange:
astate := 'TimeChange';
TApplicationEvent.OpenURL:
astate := 'OpenURL';
end;
Self.Memo1.Lines.Add(astate);
Result := true;
end;
end.
还可以参考下面的例子,是消息的类型
FMX.Platform.TApplicationEvent
http://docwiki.embarcadero.com/Libraries/Seattle/en/FMX.Platform.TApplicationEvent
http://docwiki.embarcadero.com/Libraries/Tokyo/en/FMX.Platform.TApplicationEvent
TApplicationEvent = (FinishedLaunching, BecameActive, WillBecomeInactive, EnteredBackground, WillBecomeForeground, WillTerminate, LowMemory, TimeChange, OpenURL);
An instance of TApplicationEvent may have any of the following values:
Item | Description | Platform | |
---|---|---|---|
Android | iOS | ||
|
Your application has gained the focus.//applicationDidBecomeActive |
Supported |
Supported |
|
The user is no longer using your application, but your application is still running in the background. |
Supported |
Supported |
|
Your application has been launched. |
Supported |
Supported |
|
This warns your application that the device is running out of memory. Your application should reduce memory usage, freeing structures and data that can be loaded again at a later point. |
Supported |
Supported |
|
You application has received a request to open an URL. Application events of this type are usually associated with a context. This context is an instance of the iOS-only
See the iOS API reference documentation for more information. |
Supported |
|
|
There has been a significant change in time. This event might happen for example when the day changes or when the device changes to or from daylight savings time. |
Supported |
|
|
The user is now using your application, which was previously in the background. |
Supported |
Supported |
|
Your application is going to loose the focus. / applicationWillResignActive |
Supported |
Supported |
|
The user is quitting your application. |
Supported |
Supported |
http://codeverge.com/embarcadero.delphi.ios/ifmxapplicationeventservice-not-firing/2028062
http://codeverge.com/embarcadero.delphi.firemonkey/keep-application-on-top/2009583
http://community.embarcadero.com/index.php/blogs/entry/mobile-app-lifecycle-events-handling-in-delphi-xe5-40067
http://codeverge.com/embarcadero.delphi.firemonkey/keep-application-on-top/2009583
FMX.Platform.pas
procedure TMainForm.FormCreate( Sender : TObject ); var SvcEvents : IFMXApplicationEventService; begin if TPlatformServices.Current.SupportsPlatformService ( IFMXApplicationEventService, IInterface( SvcEvents ) ) then SvcEvents.SetApplicationEventHandler( HandleAppEvent ); Application.OnException := ExceptionHandler; end; function TMainForm.HandleAppEvent( AAppEvent : TApplicationEvent; AContext : TObject ) : Boolean; begin case AAppEvent of TApplicationEvent.FinishedLaunching : ; TApplicationEvent.BecameActive : ;//第一次运行app触发,从后台切换过来也触发 TApplicationEvent.WillBecomeInactive : ; TApplicationEvent.EnteredBackground : ;//切换到后台 TApplicationEvent.WillBecomeForeground : ;//从后台切换到前台 TApplicationEvent.WillTerminate : ; TApplicationEvent.LowMemory : ; TApplicationEvent.TimeChange : ; TApplicationEvent.OpenURL : ; end; Result := True; end; //See more at : http://codeverge.com/embarcadero.delphi.firemonkey/keep-application-on-top/2009583
和IOS的对比
/app启动完毕调用,应用初次启动 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
//进入后台时调用:一般在这里保存应用数据(数据,比如暂停游戏) - (void)applicationDidEnterBackground:(UIApplication *)application
连续点击两次Home按钮
在任务栏点击SpringBoard或者按下Home按钮,单次点击Home按钮
- (void)applicationWillResignActive:(UIApplication *)application
//程序回到时调用,恢复数据
- (void)applicationWillEnterForeground:(UIApplication *)application
//接收内存警告时候调用
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application
//程序即将退出
- (void)applicationWillTerminate:(UIApplication *)application
//程序获取焦点,在任务栏中回到app
- (void)applicationDidBecomeActive:(UIApplication *)application
procedure TMainForm.FormCreate(Sender: TObject); var SvcEvents: IFMXApplicationEventService; begin if TPlatformServices.Current.SupportsPlatformService(IFMXApplicationEventService, IInterface(SvcEvents)) then SvcEvents.SetApplicationEventHandler(HandleAppEvent); Application.OnException := ExceptionHandler; end; function TMainForm.HandleAppEvent(AAppEvent: TApplicationEvent; AContext: TObject): Boolean; begin case AAppEvent of TApplicationEvent.FinishedLaunching: ; TApplicationEvent.BecameActive: ; TApplicationEvent.WillBecomeInactive: ; TApplicationEvent.EnteredBackground: ; TApplicationEvent.WillBecomeForeground: ; TApplicationEvent.WillTerminate: ; TApplicationEvent.LowMemory: ; TApplicationEvent.TimeChange: ; TApplicationEvent.OpenURL: ; end; Result := True; end; - See more at: http://codeverge.com/embarcadero.delphi.firemonkey/keep-application-on-top/2009583#sthash.6XM5jEUI.dpuf
跟踪的时间触发日志。
FormCreate
FormShow
BecameActive
FormSaveState
EnteredBackgrounbd
WillBecomeForeground
BecameActive
FormSaveState
EnteredBackgrounbd
WillBecomeForeground
BecameActive
FormSaveState
EnteredBackgrounbd
WillBecomeForeground
BecameActive
function TFMXMusicPlayerFrm.HandleAppEvent(AAppEvent: TApplicationEvent; AContext: TObject): Boolean; var astate: string; begin case AAppEvent of TApplicationEvent.FinishedLaunching: astate := 'FinishedLaunching'; TApplicationEvent.BecameActive: astate := 'BecameActive'; TApplicationEvent.WillBecomeInactive: astate := 'WillBecomeInactive'; TApplicationEvent.EnteredBackground: astate := 'EnteredBackground'; TApplicationEvent.WillBecomeForeground: astate := 'WillBecomeForeground'; TApplicationEvent.WillTerminate: astate := 'WillTerminate'; TApplicationEvent.LowMemory: astate := 'LowMemory'; TApplicationEvent.TimeChange: astate := 'TimeChange'; TApplicationEvent.OpenURL: astate := 'OpenURL'; end;
Result := true; end;
FMX.Platform.iOS.pas
Application delegates
TApplicationDelegate = class{(TOCLocal, UIApplicationDelegate)} private FMainWindow: TFMXWindow; public function application(Sender: UIApplication; didFinishLaunchingWithOptions: NSDictionary): Boolean; overload; cdecl; procedure application(Sender: UIApplication; didReceiveLocalNotification: UILocalNotification); overload; cdecl; procedure application(Sender: UIApplication; didRegisterForRemoteNotificationsWithDeviceToken: NSData); overload; cdecl; function application(const openURL, sourceApplication: string; annotation: Pointer): Boolean; overload; cdecl; procedure applicationDidBecomeActive(const Sender: UIApplication); cdecl; procedure applicationDidEnterBackground(const Sender: UIApplication); cdecl; procedure applicationDidRegisterForRemoteNotificationsWithDeviceToken(Sender: UIApplication; AToken: NSData); cdecl; procedure applicationDidReceiveRemoteNotification(Sender: UIApplication; ANotification: NSDictionary); cdecl; procedure didFailToRegisterForRemoteNotificationsWithError(Sender: UIApplication; AError: NSError); cdecl; procedure applicationDidReceiveMemoryWarning(Sender: UIApplication); cdecl; procedure applicationSignificantTimeChange(Sender: UIApplication); cdecl; procedure applicationWillEnterForeground(Sender: UIApplication); cdecl; procedure applicationWillResignActive(Sender: UIApplication); cdecl; procedure applicationWillTerminate(Sender: UIApplication); cdecl; procedure setWindow(window: UIWindow); cdecl; function window: UIWindow; cdecl; property MainWindow: TFMXWindow read FMainWindow; end;
// Application delegates function applicationDidFinishLaunchingWithOptions(self: id; _cmd: SEL; application: PUIApplication; options: PNSDictionary): Boolean; cdecl; begin Result := PlatformCocoa.FAppDelegate.application(TUIApplication.Wrap(application), TNSDictionary.Wrap(options)); end; procedure applicationDidReceiveLocalNotification(self: id; _cmd: SEL; application: PUIApplication; notification: Pointer); cdecl; begin PlatformCocoa.FAppDelegate.application(TUIApplication.Wrap(application), TUILocalNotification.Wrap(notification)); end; procedure didReceiveRemoteNotification(self: id; _cmd: SEL; app: PUIApplication; ANotification: PNSDictionary); cdecl; begin PlatformCocoa.FAppDelegate.applicationDidReceiveRemoteNotification(TUIApplication.Wrap(app), TNSDictionary.Wrap(ANotification)); end; procedure didFailToRegisterForRemoteNotificationsWithError(self: id; _cmd: SEL; app: PUIApplication; error: PNSError); cdecl; begin PlatformCocoa.FAppDelegate.didFailToRegisterForRemoteNotificationsWithError(TUIApplication.Wrap(application), TNSError.Wrap(error)); end; procedure didRegisterForRemoteNotificationsWithDeviceToken(self: id; _cmd: SEL; application: PUIApplication; deviceToken: PNSData); cdecl; begin PlatformCocoa.FAppDelegate.applicationDidRegisterForRemoteNotificationsWithDeviceToken(TUIApplication.Wrap(application), TNSData.Wrap(deviceToken)); end; procedure applicationOpenURLWithSourceAnnotation(self: id; _cmd: SEL; application: PUIApplication; url: Pointer; sourceApplication: PNSString; annotation: id); var URLString: string; SourceAppString: string; begin if url <> nil then URLString := NSStrToStr(TNSURL.Wrap(url).absoluteString) else URLString := ''; if sourceApplication <> nil then SourceAppString := NSStrToStr(TNSString.Wrap(sourceApplication)) else SourceAppString := ''; PlatformCocoa.FAppDelegate.application(URLString, SourceAppString, annotation); end; procedure applicationDidBecomeActive(self: id; _cmd: SEL; application: PUIApplication); cdecl; begin PlatformCocoa.FAppDelegate.applicationDidBecomeActive(TUIApplication.Wrap(application)); end; procedure applicationDidEnterBackground(self: id; _cmd: SEL; application: PUIApplication); cdecl; begin PlatformCocoa.FAppDelegate.applicationDidEnterBackground(TUIApplication.Wrap(application)); end; procedure applicationWillEnterForeground(self: id; _cmd: SEL; application: PUIApplication); cdecl; begin PlatformCocoa.FAppDelegate.applicationWillEnterForeground(TUIApplication.Wrap(application)); end; procedure applicationWillTerminate(self: id; _cmd: SEL; application: PUIApplication); cdecl; begin PlatformCocoa.FAppDelegate.applicationWillTerminate(TUIApplication.Wrap(application)); end; procedure applicationDidReceiveMemoryWarning(self: id; _cmd: SEL; application: PUIApplication); cdecl; begin PlatformCocoa.FAppDelegate.applicationDidReceiveMemoryWarning(TUIApplication.Wrap(application)); end;