如何处理App的Application的事件

亦余心之所善兮,虽九死其犹未悔。这篇文章主要讲述如何处理App的Application的事件相关的知识,希望能为你提供帮助。
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.TApplicationEventFMX.Platform.TApplicationEventhttp://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:
ItemDescriptionPlatform
androidios
BecameActive
Your application has gained the focus.//applicationDidBecomeActive
Supported
Supported
EnteredBackground
The user is no longer using your application, but your application is still running in the background.
Supported
Supported
FinishedLaunching
Your application has been launched.
Supported
Supported
LowMemory
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
OpenURL
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  TiOSOpenApplicationContext  class, which provides the following read-only properties:
  • TiOSOpenApplicationContext.SourceApp  is a string that contains the  bundle ID  of the application that requested your application to open the URL.
  • TiOSOpenApplicationContext.URL  is the URL to open, either a network resource or a file.
  • TiOSOpenApplicationContext.Context  is a pointer to a  property-list object  that might provide additional information.
See the  iOS API reference documentation  for more information.
  Supported
TimeChange
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
WillBecomeForeground
The user is now using your application, which  was previously in the background.
Supported
Supported
WillBecomeInactive
Your application is going to loose the focus. / applicationWillResignActive
Supported
Supported
WillTerminate
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

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 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



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




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
 
如何处理App的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 : ; //第一次运行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

如何处理App的Application的事件

文章图片
  和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
 
如何处理App的Application的事件

文章图片
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;

如何处理App的Application的事件

文章图片
 
FMX.Platform.iOS.pas
Application delegates
如何处理App的Application的事件

文章图片
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;

如何处理App的Application的事件

文章图片
【如何处理App的Application的事件】 
如何处理App的Application的事件

文章图片
// Application delegatesfunction 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;

如何处理App的Application的事件

文章图片
 

    推荐阅读