Java 从其他onCreate方法启动一个活动 问题描述

Java 从其他onCreate方法启动一个活动 问题描述,java,android,android-activity,oncreate,Java,Android,Android Activity,Oncreate,我正在编写Android应用程序,它包含两个活动:MainActivity和SplashActivity。当MainActivity启动时,加载UI需要一些时间,而且它正在后台执行一些工作。因此,为了不显示不完整的UI(白色屏幕等),我决定启动我的MainActivity并在其onCreate()方法startSplashActivity中右键启动SplashActivity,并在一段时间后关闭SplashActivity,因此我假设此时我的MainActivity将已经加载。因此,我尝试了下面

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

代码 在清单文件中,作为
启动器
活动被设置为
main活动
。该代码如下所示:

  • main活动
    显示
  • 当我关闭
    main时,活动
    splash活动
    出现在前面
  • 但我需要以下行为

  • main活动
    从“后台”开始
  • splash活动
    走到前面,过一段时间后自行关闭
  • `MainActivty'已加载到前面

  • 您可以在MainActivity中启动一个对话框。它将显示在MainActivity前面,您可以在后台完成工作后关闭它


    请参见此处:

    您的任务可以通过在一个活动中使用片段或视图来解决。 在活动的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();
            }
    }
    

    无论如何。如果您想使用活动,您需要在SplashActivity中使用您的后台作业的侦听器。您应该使用startActivityForResult()启动Splash活动。作业完成后,您应该完成SplashActivity并继续在MainActivity中的onActivityResult()方法中处理。

    您可以使用
    异步任务。首先启动
    splash活动
    ,加载所有必要的数据后,启动
    main活动
    。试着这样做:

    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);
        }
    }
    
    公共类SplashActivity扩展了AppCompatActivity{
    @凌驾
    创建时受保护的void(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_splash);
    AsyncTask AsyncTask=新建AsyncTask(){
    @凌驾
    受保护的Void doInBackground(Void…参数){
    //在这里加载数据
    返回null;
    }
    @凌驾
    受保护的void onPostExecute(void结果){
    startActivity(新意图(SplashActivity.this、MainActivity.class));
    完成();
    }
    };
    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);
        }
    
    }
    
    开始你的喷溅吧
    没有历史意图标志或在清单中定义android:noHistory for ur splah活动

    您可以遵循。这不会有帮助,因为我在UI方面有很多问题。UI未显示正确的白色屏幕显示了一段时间,之后显示良好的屏幕。
    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);
        }
    
    }