Android - 应用程序徽标活动

goo*_*dle 4 android android-intent android-activity

我有一个似乎是一个简单的问题,但对于我的生活无法弄清楚这一点......

我有一个主要的活动,显示公司徽标,基本上是一个闪屏.我想让它显示2秒左右,然后淡出到实际的应用程序主要活动.我试图使用sleep实现,但这样做会给我一个空白的屏幕标识活动.似乎在睡眠完成之后图像才会被加载.基本上应用程序启动,显示黑屏2秒,然后转换到我的应用程序.如果我点击后面,我会看到徽标.我在这做错了什么?这是我的徽标代码.logo.xml有一个带有可绘制资源的ImageView:

public class Logo extends Activity {

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.logo);

        // Intent to jump to the next activity
        Intent intent= new Intent(this, NextActivity.class);
        this.startActivity(intent);

        SystemClock.sleep(2000);
    }
}
Run Code Online (Sandbox Code Playgroud)

Ted*_*opp 8

你正在阻止UI线程,这是一个很大的禁忌.在onCreate方法返回之前,系统无法绘制屏幕.执行所需操作的常用方法是启动一个等待的单独线程,然后将Runnable发布到UI线程:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.logo);
    final Handler handler = new Handler();
    final Runnable doNextActivity = new Runnable() {
        @Override
        public void run() {
            // Intent to jump to the next activity
            Intent intent= new Intent(this, NextActivity.class);
            startActivity(intent);
            finish(); // so the splash activity goes away
        }
    };

    new Thread() {
        @Override
        public void run() {
            SystemClock.sleep(2000);
            handler.post(doNextActivity);
        }
    }.start();
}
Run Code Online (Sandbox Code Playgroud)

一种更简单的方式(正如Athmos在他的回答中建议的那样)是让处理程序为你做倒计时:

Handler mHandler;
Runnable mNextActivityCallback;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.logo);
    mHandler = new Handler();
    mNextActivityCallback = new Runnable() {
        @Override
        public void run() {
            // Intent to jump to the next activity
            Intent intent= new Intent(this, NextActivity.class);
            startActivity(intent);
            finish(); // so the splash activity goes away
        }
    };
    mHandler.postDelayed(mNextActivityCallback, 2000L);
}
Run Code Online (Sandbox Code Playgroud)

这样做的好处是您可以取消继续下一个活动(例如,如果使用按下后退按钮,或者如果您在这2秒内检测到错误情况):

@Override
protected void onPause() {
    if (isFinishing()) {
        mHandler.removeCallbacks(mNextActivityCallback);
    }
}
Run Code Online (Sandbox Code Playgroud)