亦余心之所善兮,虽九死其犹未悔。这篇文章主要讲述如何处理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:
Item | Description | Platform | |
---|---|---|---|
android | ios | ||
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:
|
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
文章图片
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;
文章图片
【如何处理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;
文章图片
推荐阅读
- Delphi XE6 Android拨号函数
- 如何在Magento 2中设置货到付款(COD)付款方式()
- Android Studio更改工程名异常解决方案 (can't rename root module)
- Data Binding Android - Type parameter T has incompatible upper bounds : ViewDataBinding and MainAct(
- Android开发——打造简单的Viewpager指示器(小圆点指示器)
- Android5.0L退出APP横竖屏切换导致的触摸屏输入(Touch Event)无效(冻屏)问题分析(Key Event仍然有效)
- Eclipseeclipse部署web项目至本地的tomcat但在webapps中找不到
- licecap软件——简单做出app的效果gif图
- Android四大组件(BroadcastReceiver的使用)