Search code examples
javaandroidandroid-activityoncreate

Start one activity from other onCreate method


Problem Description

I am writing Android application which contains two activities: MainActivity and SplashActivity. When MainActivitystarts it takes some time to load UI and also it is doing some work in background. So in order not to show incomplete UI (white screen etc.) I decide start my MainActivity and right in its onCreate() method start SplashActivity and after some time close SplashActivity so I assume that at that point my MainActivity will be already loaded. So for this I tried the code below:

Code

public class MainActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {

        Intent intent = new Intent(LoginActivity.this, SetPassword.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
        startActivity(intent);

        .........
    }
}

In a manifest file as a LAUNCHER activity is set MainActivity. This code follows as following:

  1. MainActivity is shown.
  2. When I close MainActivity SplashActivity comes to front.

But I need following behavior

  1. MainActivity starts in 'background'
  2. SplashActivity come to front and after some time close itself
  3. `MainActivty' already loaded come to front.

Solution

  • You can use an AsyncTask. Start firs the SplashActivity and when all your necessary data is loaded, start the MainActivity. Try something like this:

    public class SplashActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            setContentView(R.layout.activity_splash);
    
            AsyncTask<Void, Void, Void> asyncTask = new AsyncTask<Void, Void, Void>() {
    
                @Override
                protected Void doInBackground(Void... params) {
                    // Load your data here
                    return null;
                }
    
                @Override
                protected void onPostExecute(Void result) {
                    startActivity(new Intent(SplashActivity.this, MainActivity.class));
                    finish();
                }
    
            };
            asyncTask.execute(null, null);
        }
    }