Android - 应用程序徽标活动

时间:2012-06-21 00:51:05

标签: 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);
    }
}

4 个答案:

答案 0 :(得分: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();
}

一种更简单的方式(正如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);
}

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

@Override
protected void onPause() {
    if (isFinishing()) {
        mHandler.removeCallbacks(mNextActivityCallback);
    }
}

答案 1 :(得分:0)

而不是在构造函数中使用sleep,这会使视图的构造延迟2秒,这就是为什么它只显示2秒后的图片,请尝试按照此处的建议

http://androidforums.com/40306-post4.html 另外对于后退按钮问题添加

android:noHistory="true"

到徽标活动的清单

答案 2 :(得分:0)

使用onResume()和Handler,简单易用的方式

你试过这个......

// Intent to jump to the next activity
Intent intent= new Intent(this, NextActivity.class);
SystemClock.sleep(2000); //NOTE before the start of the next activity
this.startActivity(intent);

...在onResume();

据我所知,在调用onCreate()时,并不认为Activity是正确显示的。但onResume()总是被调用,据我所知,当时应该显示everthing。 如果您只想展示一次,请为它制作标志。 见:Activity lifecycle

但无论如何,你做错了什么;)使用Handler,Thread或类似的

其他解决方案:

  • 为什么不显示所有内容的ImageView,只是隐藏它 2s后?您可以使用Handler来延迟。甚至使用 透明度,使花哨的淡出。看看ImageView setAlpha(...)
  • 为什么不使用Handler代替sleep(...)。恕我直言sleep(...)可能导致'应用程序无响应'

这段代码应该用于工作:

Handler mHandler = new Handler();

class MyTask implements Runnable{
    public void run(){
        //start next activity or fadeout ImageView or ...
    }
}

现在调用onResume:

mHandler.postDelayed(new MyTask(), 100); //or any other Runnable

答案 3 :(得分:0)

你应该在新线程中使用sleep,因为它停止执行oncreate方法,你可以在设置setcontentview之后使用它