从其他 onCreate 方法启动一个 activity

Start one activity from other onCreate method

问题描述

我正在编写 Android 应用程序,其中包含两个活动:MainActivitySplashActivity。当 MainActivity 启动时,它需要一些时间来加载 UI 并且它还在后台做一些工作。因此,为了不显示不完整的 UI(白屏等),我决定启动我的 MainActivity 并在其 onCreate() 方法中启动 SplashActivity 并在一段时间后关闭 SplashActivity 所以我假设那时我的 MainActivity 已经加载。为此,我尝试了以下代码:

代码

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);

        .........
    }
}

在清单文件中设置了 LAUNCHER activity MainActivity。此代码如下:

    显示
  1. MainActivity
  2. 当我关闭时MainActivitySplashActivity来到前面

但我需要以下行为

  1. MainActivity 开始于 'background'
  2. SplashActivity 来到前面,一段时间后自行关闭
  3. `MainActivty' 已经加载到前面。

您可以在 MainActivity 中启动一个对话框。它会出现在 MainActivity 前面,您可以在后台工作完成后将其关闭。

看这里:Dialog

您的任务可以通过在一个 activity 中使用片段或视图来解决。 在 activity 的 onCreate() 方法中,您可以显示 SplashFragment。完成所有后台工作后,您可以将其替换为 MainFragment。使用不同的视图(设置它们的可见性)可以实现同样的事情。

示例:

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

        SplashFragment splashFragment = new SplashFragment();
        getSupportFragmentManager().beginTransaction()
                .add(R.id.fragment_container,splashFragment).commit();
        }


    public void onLoad(){

        MainFragment mainFragment = new MainFragment();
        getSupportFragmentManager().beginTransaction()
               .replace(R.id.fragment_container,mainFragment).commit();
        }
}

任何方式。如果你想使用 activity,你需要在 SplashActivity 中使用你后台作业的监听器。您应该使用 startActivityForResult() 启动 SplashActivity。工作完成后,您应该完成 SplashActivity 并在 MainActivity 的 onActivityResult() 方法中继续处理。

您可以使用 AsyncTask。首先启动 SplashActivity,当所有必要的数据加载完毕后,启动 MainActivity。尝试这样的事情:

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);
    }
}

您可以先启动初始屏幕,然后导航到 MainActivity,如下所示:

public class SplashScreen extends Activity {
    int timeout = 5000; 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash_screen);

        new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    Intent i = new Intent(SplashScreen.this, MainActivity.class);
                    startActivity(i);
                    finish();
                }
        }, timeout);
    }

}

开始你的飞溅 NO_HISTORY 意图标志或在清单中定义 android:noHistory 为你的 splah activity