我如何告诉某项活动结束?

时间:2019-12-18 18:08:12

标签: android

我有两个Activity子类。一个是我的MainActivity,另一个是名为SplashActivity的启动屏幕。这是我想发生的事情:

  1. 打开我的应用
  2. 应用MainActivity启动
  3. MainActivity使用SplashActivity方法启动startActivity()
  4. 主要活动开始进行一些需要一段时间的设置/加载。
  5. 加载/设置工作完成
  6. 停止SplashActivity,然后回到MainActivity

我使用SplashActivity中的这段代码启动MainActivity.onCreate()

startActivity(new Intent(this, SplashActivity.class));

如何告诉SplashActivity跳出屏幕并从MainActivity本身返回到MainActivity

编辑:请注意,在询问之前我对此进行了一些研究。我发现的唯一解决方案涉及从内部 SplashActivity本身进行操作,但是SplashActivity并不能真正控制我正在考虑的模型。 MainActivity正在从外部控制飞溅。如果这不是它应该工作的方式,那么我也愿意采用一种新的方法/设计。

4 个答案:

答案 0 :(得分:1)

执行此操作的一种方法是,不对初始屏幕使用单独的活动,而可以在XML中为初始屏幕添加视图,该视图覆盖MainActivity的整个屏幕,然后将其隐藏(通过将其可见性设置为GONE)只要您的设置/加载完成。

答案 1 :(得分:0)

MainActivity 上完成工作后,调用 SplashActivity 上的finish()函数。

答案 2 :(得分:0)

Activity#finish()

这肯定是在完成“活动”且需要关闭时所需要的呼叫。

我可以想到两个简单的答案。

首先,从您的问题“加载/设置工作完成”开始,您现在绝对可以在finish()中调用SplashActivity

第二,在父SplashActivity中保存一个MainActivity的实例,并使这两个活动相互通信。像这样,在完成加载/设置后,请使用侦听器通知MainActivity,然后MainActivity才能完成SplashActivity。但是,请谨慎保存并泄漏SplashActivity的实例。

不过,我要问的是,因为您的要求和实现方式对我来说还不是很清楚,请问自己是否真的需要SplashActivity

如果您需要一个琐碎的加载UI,那么您不能在MainActivity内完成它。

如果您需要非平凡的加载UI,那么如何使用Fragment?

答案 3 :(得分:-1)

解决方案1::您可以使用EventBus通知SplashActivity,当MainActivity完成设置或加载某些内容时,它应该自行完成。

1。通过gradle文件将EventBus依赖项添加到您的项目中

implementation 'org.greenrobot:eventbus:3.1.1'

2。在MainActivity中

public class MainActivity extends AppCompatActivity {

    // Assume you use a background thread to setup or load something.
    private Thread thread;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        setupOrLoadingSomething();

        startActivity(new Intent(this, SplashActivity.class));
    }

    private void setupOrLoadingSomething() {
        if (thread == null) {
            thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    Log.i("MainActivity", "Start setup");
                    try {
                        // Pretend this will run for 10 seconds
                        Thread.sleep(10000);

                        Log.i("MainActivity", "Finish setup");

                        //  Tell the SplashActivity to pop off the screen
                        EventBus.getDefault().postSticky(new FinishActivityEvent());
                    } catch (InterruptedException e) {
                        Log.i("MainActivity", "Thread has been terminated.");
                    }
                }
            });
            thread.start();
        }
    }

    @Override
    protected void onDestroy() {
        // Make sure release thread when activity finish
        if (thread != null && thread.isAlive()) {
            thread.interrupt();
        }
        super.onDestroy();
    }
}

3。在SplashActivity中

public class SplashActivity extends AppCompatActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);
    }

    @Override
    protected void onStart() {
        super.onStart();
        EventBus.getDefault().register(this);
    }

    @Override
    protected void onStop() {
        EventBus.getDefault().unregister(this);
        super.onStop();
    }

    @Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
    public void onFinishMyself(FinishActivityEvent event) {
        Log.i("SplashActivity", "Finish myself");
        EventBus.getDefault().removeStickyEvent(FinishActivityEvent.class);
        finish();
    }
}

解决方案2:,以防您无法修改SplashActivity代码

1。在AndroidManifest.xml文件中,使MainActivity的启动模式为“ singleTask”

<activity android:name=".MainActivity" android:launchMode="singleTask">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

2。在MainActivity中

public class MainActivity extends AppCompatActivity {

    // Use this thread to do setup or loading something.
    private Thread thread;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        setupOrLoadingSomething();
        startActivity(new Intent(this, SplashActivity.class));
    }

    private void setupOrLoadingSomething() {
        if (thread == null) {
            thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    Log.i("MainActivity", "Start setup");
                    try {
                        // Pretend this will rung for 10 seconds
                        Thread.sleep(10000);
                        Log.i("MainActivity", "Finish setup");

                        //  Tell the SplashActivity to pop off the screen
                        startActivity(new Intent(MainActivity.this, MainActivity.class));
                    } catch (InterruptedException e) {
                        Log.i("MainActivity", "Thread has been terminated.");
                    }
                }
            });
            thread.start();
        }
    }

    @Override
    protected void onDestroy() {
        // Make sure release thread when activity finish
        if (thread != null && thread.isAlive()) {
            thread.interrupt();
        }
        super.onDestroy();
    }
}

3。在SplashActivity中

public class SplashActivity extends AppCompatActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);
    }
}