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.