我有两个Activity
子类。一个是我的MainActivity
,另一个是名为SplashActivity
的启动屏幕。这是我想发生的事情:
MainActivity
启动MainActivity
使用SplashActivity
方法启动startActivity()
。SplashActivity
,然后回到MainActivity
。我使用SplashActivity
中的这段代码启动MainActivity.onCreate()
:
startActivity(new Intent(this, SplashActivity.class));
如何告诉SplashActivity
跳出屏幕并从MainActivity
本身返回到MainActivity
?
编辑:请注意,在询问之前我对此进行了一些研究。我发现的唯一解决方案涉及从内部 SplashActivity
本身进行操作,但是SplashActivity
并不能真正控制我正在考虑的模型。 MainActivity
正在从外部控制飞溅。如果这不是它应该工作的方式,那么我也愿意采用一种新的方法/设计。
答案 0 :(得分:1)
执行此操作的一种方法是,不对初始屏幕使用单独的活动,而可以在XML中为初始屏幕添加视图,该视图覆盖MainActivity的整个屏幕,然后将其隐藏(通过将其可见性设置为GONE)只要您的设置/加载完成。
答案 1 :(得分:0)
在 MainActivity 上完成工作后,调用 SplashActivity 上的finish()
函数。
答案 2 :(得分:0)
这肯定是在完成“活动”且需要关闭时所需要的呼叫。
我可以想到两个简单的答案。
首先,从您的问题“加载/设置工作完成”开始,您现在绝对可以在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);
}
}