Важно (9.07.22)

Если картинки в постах не отображаются, зайдите в блог через прокси. РКН заблокировал поддомены blogger.com на которые загружались картинки.

воскресенье, 27 октября 2013 г.

Жизненный цикл мобильного приложения

Жизненный цикл мобильного приложения более сложный и отличается от настольных приложений. На мобильном устройстве приложение работает либо на переднем плане, либо в фоновом режиме. Если вы программист, то вам может понадобиться отслеживать изменения в состоянии приложения, например для сохранения текущего состояния (настроек и т.п.) приложения, когда приложение уходит в фоновый режим или обновление экрана, когда приложение возвращается на передний план.

Android полностью поддерживает многозадачность. Вы будете удивлены, как много приложений постоянно выполняется на вашем мобильном устройстве. Посмотреть список выполняемых приложений можно при помощи диспетчера задач. На Nexus 7 есть специальная кнопка справа от кнопки "Home", позволяющая увидеть список запущенных приложений.


Ознакомиться с описанием жизненного цикла приложения можно здесь: http://developer.android.com/reference/android/app/Activity.html
В Firemonkey(FMX) есть модуль "FMX.Platform". Он содержит определение интерфейса "IFMXApplicationEventService", который позволяет зарегистрировать обработчик события, для получения событий жизненного цикла приложения.
Автор статьи написал простенькое приложение, чтобы увидеть какие события происходят с приложением.
Ниже приведён код всего проекта:

unit Unit11;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Layouts,
  FMX.Memo, FMX.Platform, FMX.StdCtrls;

type
  TForm11 = class(TForm)
    Memo1: TMemo;
    ToolBar1: TToolBar;
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
  private
    procedure Log(s: string);
  public
    function HandleAppEvent(AAppEvent: TApplicationEvent; AContext: TObject): Boolean;
  end;

var
  Form11: TForm11;

implementation

{$R *.fmx}

{ TForm11 }

procedure TForm11.FormCreate(Sender: TObject);
var aFMXApplicationEventService: IFMXApplicationEventService;
begin
  if TPlatformServices.Current.SupportsPlatformService(IFMXApplicationEventService, IInterface(aFMXApplicationEventService)) then
    aFMXApplicationEventService.SetApplicationEventHandler(HandleAppEvent)
  else
    Log('Application Event Service is not supported.');
end;

function TForm11.HandleAppEvent(AAppEvent: TApplicationEvent;
  AContext: TObject): Boolean;
begin
  case AAppEvent of
    aeFinishedLaunching: Log('Finished Launching');
    aeBecameActive: Log('Became Active');
    aeWillBecomeInactive: Log('Will Become Inactive');
    aeEnteredBackground: Log('Entered Background');
    aeWillBecomeForeground: Log('Will Become Foreground');
    aeWillTerminate: Log('Will Terminate');
    aeLowMemory: Log('Low Memory');
    aeTimeChange: Log('Time Change');
    aeOpenURL: Log('Open URL');
  end;
  Result := True;
end;

procedure TForm11.Log(s: string);
begin
  Memo1.Lines.Add(TimeToStr(Now) + ': ' + s);
end;

end.


Был проведён эксперимент: Когда приложение запущено на устройстве, переключаемся на другое приложение, а затем обратно на наше приложение. Ниже приведён скриншот планшета Nexus 2013 под управлением Android 4.3 с работающим проектом "LifecycleDemo".


Исходный код проекта "LifecycleDemo" можно скачать с Code Central.

p.s. Это вольный перевод статьи "Mobile app lifecycle events handling in Delphi XE5" (Автор: Paweł Głowacki)