Android Display Splash-Screen While Loading


Answer :

You should not be creating a new thread on startup, instead you should create a view that does not have to wait for your resources to load, as detailed in this article: Splash Screens the Right Way.

As stated in the article, you should create a layer-list drawable instead of a layout XML file:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">      <!-- Fill the background with a solid color -->     <item android:drawable="@color/gray"/>      <!-- Place your bitmap in the center -->     <item>         <bitmap             android:gravity="center"             android:src="@mipmap/ic_launcher"/>     </item>  </layer-list> 

Then create a theme using the drawable file as a background. I use the background attribute instead of the windowBackground attribute as suggested in the article, because background takes the status and navigation bars into account, centering the drawable better. I also set windowAnimationStyle to null so that the splash screen does not animate the transition to the MainActivity:

<resources>      <!-- Base application theme -->     <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">         <!-- Customize your theme here. -->     </style>      <!-- Splash Screen theme -->     <style name="SplashTheme" parent="Theme.AppCompat.NoActionBar">         <item name="android:background">@drawable/background_splash</item>         <item name="android:windowAnimationStyle">@null</item>     </style>  </resources> 

Then declare your theme in the manifest for your SplashActivity:

<activity android:name=".SplashActivity"     android:theme="@style/SplashTheme">     <intent-filter>         <action android:name="android.intent.action.MAIN" />          <category android:name="android.intent.category.LAUNCHER" />     </intent-filter> </activity> 

And finally all you have to do in your SplashActivity is start your MainActivity, and the splash screen will only show for as long as it takes for your app to configure:

public class SplashActivity extends AppCompatActivity {      @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);          Intent intent = new Intent(this, MainActivity.class);         startActivity(intent);         finish();     } } 

If there are no specific constraints about the time the splash screen should be shown, you could use the AsyncTask in the following way:

public class SplashScreen extends Activity {     @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.activity_startup);         startHeavyProcessing();      }      private void startHeavyProcessing(){        new LongOperation().execute("");     }      private class LongOperation extends AsyncTask<String, Void, String> {          @Override         protected String doInBackground(String... params) {             //some heavy processing resulting in a Data String             for (int i = 0; i < 5; i++) {                 try {                     Thread.sleep(1000);                 } catch (InterruptedException e) {                     Thread.interrupted();                 }             }             return "whatever result you have";         }          @Override         protected void onPostExecute(String result) {             Intent i = new Intent(SplashScreen.this, MainActivity.class);             i.putExtra("data", result);             startActivity(i);             finish();         }          @Override         protected void onPreExecute() {}          @Override         protected void onProgressUpdate(Void... values) {}     } } 

If the resulting data if of another nature than a String you could put a Parcelable Object as an extra to your activity. In onCreate you can retrieve the data with:

getIntent().getExtras.getString('data');


Comments

Popular posts from this blog

Are Regular VACUUM ANALYZE Still Recommended Under 9.1?

Can Feynman Diagrams Be Used To Represent Any Perturbation Theory?