你好我想在默认情况下显示另一个启动画面,如果应用程序第一次启动(例如,在安装之后)。
所以我写了这个。但是新的Activity没有启动它停留在Splash屏幕上。有人会说它有什么不对吗?
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.widget.TextView;
public class splash extends Activity {
private Thread splashTread;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.splash);
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
if(!prefs.getBoolean("firstTime", false)) {
// run your one time code
Intent i = new Intent(splash.this, main.class);
startActivity(i);
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean("firstTime", true);
editor.commit();
// thread for displaying the SplashScreen
splashTread = new Thread() {
@Override
public void run() {
try {
synchronized(this){
//wait 2 sec
wait(2000);
}
} catch(InterruptedException e) {}
finally {
finish();
//start a new activity
Intent i = new Intent();
i.setClass(splash.this, main.class);
startActivity(i);
stop();
}
}
};
splashTread.start();
}
}
}
感谢。
答案 0 :(得分:6)
从我所看到的,无论启动是否是第一次,您的代码都运行相同的Activity(main)。我假设您的目的是在第一次启动时立即启动备用启动屏幕,否则在2秒后继续执行主活动。此外,我建议使用Handler而不是Thread,因为你只使用它一次,并且延迟使用。试试这个:
public class splash extends Activity
{
private Handler handler = new Handler()
{
public void handleMessage(Message msg)
{
Intent i = new Intent(splash.this, main.class);
splash.this.startActivity(i);
this.finish()
}
};
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
if(!prefs.getBoolean("first_time", false))
{
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean("first_time", true);
editor.commit();
Intent i = new Intent(splash.this, otherSplash.class);
this.startActivity(i);
this.finish();
}
else
{
this.setContentView(R.layout.splash);
handler.sendEmptyMessageDelayed(0, 2000);
}
}
}
答案 1 :(得分:1)
而不是调用finish()
...只需使用FLAG_ACTIVITY_CLEAR_TOP
http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_CLEAR_TOP
以下是有关该FLAG的更多信息
FLAG_ACTIVITY_CLEAR_TOP in Android
为了更清楚,我建议的是你要么
Splash
成为默认活动,并在超时后调用Main
活动,或者,如果已经看到启动(首选项检查)。 (即,所有启动逻辑都在Splash
活动中)Main
活动检查以查看是否应调用Splash
(首选项检查),如果是,请使用相同的CLEAR_TOP
标志启动它,然后使用Splash
超时并在几秒钟后使用Main
再次设置CLEAR_TOP
。 (这混合了Splash
和Main
)最终结果是,Main
完成后,Splash
将成为堆栈中唯一的活动。
答案 2 :(得分:0)
如果您的目的是简单地拥有多个“Splash”屏幕,并且它们没有逻辑,除了仅显示内容之外,为什么不使用单个活动并将视图替换为第二次启动的新视图。您还必须在UI线程上执行此更新,因此您需要使用an Handler
或使用AsyncTask
,或使用已知视图中的View.post()
当前视图中的元素。
答案 3 :(得分:-1)
我认为你不能/应该从不是UI线程的线程启动活动。更改为AsyncTask,或使用处理程序