zoukankan      html  css  js  c++  java
  • 如何处理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.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:

    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

    复制代码
    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;
    复制代码
     
  • 相关阅读:
    模块化工具require 学习笔记
    学习Jade模板引擎
    通过border来实现各种三角符号
    使用vscode 编译 sass
    Javascript 运行机制
    Vue调试工具 vue-devtools
    MVVM框架
    通信类
    面向对象
    原型和原型链
  • 原文地址:https://www.cnblogs.com/westsoft/p/8413802.html
Copyright © 2011-2022 走看看