Differently from iOS, Android lacks an initial splash bitmap, but you can build one to improve startup time (or its perception). In fact, it is not that you can make things faster, but the user will get the initial screen in a shorter time than he or she will get the main form, if this takes time to initialize. You'd want to do this when the main form has many controls, requires database or file access, needs to load images, access to remote data, or anything that takes extra time. In all of these scenarios, an initial splash screen (like the one I've used in my Play Store app covered on log.marcocantu.com/blog/my_son_first_play_store_app.html) will be handy.

There are two approaches I can think of. One would be an initial screen that is never displayed again, the second would be a splash screen that acts as main menu for the application, and can be used over time. For my app, I implemented the second approach, and this is what I'm going to cover. Also, in my specific case, there are two alternative secondary forms you can go to from the main splash screen form.

First, we need to have the initial form show fast. This form should have little or no initialization code. It might have an image, covering most of its surface, plus some buttons (initially not visible, in my case). Here is the actual form at design time, and below its form definition:

      object Form2: TForm2
  object ImageControl1: TImageControl
    Align = alClient
    Bitmap = ...
  end
      object GridPanelLayout1: TGridPanelLayout
    Align = alBottom
    Height = 71.000000000000000000
    ColumnCollection = <
      item
        Value = 50.000000000000000000
      end
      item
        Value = 50.000000000000000000
      end>
    ControlCollection = <
      item
        Column = 0
        Control = Button1
        Row = 0
      end
      item
        Column = 1
        Control = Button2
        Row = 0
      end>
    RowCollection = <
      item
        Value = 100.000000000000000000
      end>
    object Button1: TButton
      Align = alClient
      Text = 'Collection'
      Visible = False
    end     object Button2: TButton
      Align = alClient
      Text = 'New Figuret'
      Visible = False
    end   end
      object ToolBar1: TToolBar
    Height = 48.000000000000000000
    object Label1: TLabel
      Align = alClient
      Text = 'My Mini Figures'
      TextAlign = taCenter
    end   end   object Timer1: TTimer
    Interval = 100
    OnTimer = Timer1Timer
  end end
      

There are a few things to notice in this FMX file definition:

  • There is a toolbar with a label covering its surface (alClient) and centered text, which acts as a title
  • There is an image covering the entire screen surface (but the toolbar and the bottom area)
  • There are two buttons at the bottom. To make them half of the screen each, I added them to a GridPanelLayout with a single row and two columns, using 50% of the width each. The two buttons are aligned to the area of each of the two cells.
  • A timer, with a short interval

Besides the UI elements, what is important for this splash screen to show faster, is to avoid creating the other forms at startup (in the main project file). However, you cannot create the secondary forms in the OnCreate handler of the main form (as you won't see it on screen until after the OnCreate event handler has finished executing). One options would have been to start a secondary thread. Another (simpler) option I've used in my code is to rely on a  timer. After the form has been created and displayed, the timer will kick in (possibly waiting a few milliseconds) and execute the following code:

      procedure TForm2.Timer1Timer(Sender: TObject);
begin
  Form1 := TForm1.Create(Application);
  Form4 := TForm4.Create(Application);
  Button2.Visible := True;
  Button1.Visible := True;
  Timer1.Enabled := False;
end;

As you can see, when the timer fires the app creates the two secondary forms (which takes a few seconds on my phone, as the program loads 60 or so images from files) and enables the two buttons. This delay and the actual initialization of the real mani form takes place while the splash screen is visible. Without this trick, the user will have a black screen... and the Android system might also indicate the app is not responding and refuse to start it.

Needless to say you'll have to adapt this splash screen code to your specific scenario, but I think it is worth using this approach in any application with a non trivial initialization. Again, you can test this in action by getting the app from the Play Store at https://play.google.com/store/apps/details?id=com.marcocantu.MyMiniFigures.