Java 跳过启动屏幕

Java 跳过启动屏幕,java,android,android-activity,splash-screen,dynamic-splash-screen,Java,Android,Android Activity,Splash Screen,Dynamic Splash Screen,我设计了一个带有按钮的闪屏。Java代码如下所示。splash的布局包含一些带有动画的文本和名为skipped splash screen的按钮。当用户按下按钮时,启动屏幕必须立即停止并打开下一个活动。但是,当我打开启动屏幕并按下跳过按钮时,下一个活动将打开,但在启动屏幕必须运行的持续时间结束后,活动将再次打开。当用户按下跳过按钮时,如何停止启动屏幕 public class Qz1 extends Activity { TextView a; TextVi

我设计了一个带有按钮的闪屏。Java代码如下所示。splash的布局包含一些带有动画的文本和名为skipped splash screen的按钮。当用户按下按钮时,启动屏幕必须立即停止并打开下一个活动。但是,当我打开启动屏幕并按下跳过按钮时,下一个活动将打开,但在启动屏幕必须运行的持续时间结束后,活动将再次打开。当用户按下跳过按钮时,如何停止启动屏幕

  public class Qz1 extends Activity {

        TextView a;
        TextView b;
        TextView c;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_qz1);
            a =(TextView)findViewById(R.id.roundOnea22);
            a.startAnimation(AnimationUtils.loadAnimation(Qz1.this, R.anim.anim_slide_in_left));
            b =(TextView)findViewById(R.id.roundOneb);
            b.startAnimation(AnimationUtils.loadAnimation(Qz1.this, R.anim.anim_slide_in_right));
            c =(TextView)findViewById(R.id.roundme);
            c.startAnimation(AnimationUtils.loadAnimation(Qz1.this, R.anim.anim_slide_in_left));




            Thread thread = new Thread(){

                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    try{
                    sleep(3200);

                    startActivity(new Intent(getApplicationContext(), Qone.class));
                    } catch (InterruptedException e){
                        e.printStackTrace();
                    }
                }
        };
        thread.start();

    }

    public void round1(View v){
       Intent i = new Intent(Qz1.this, Qone.class);
       startActivity(i);
    }
}

对于等待/睡眠场景(如启动屏幕),最好使用异步任务,但要求可能有所不同

无论如何,这是我称之为闪屏的方式:

首先创建
AsyncTask

private class SplashTask extends AsyncTask<Void, Void, Void> {

    @Override
    protected Void doInBackground(Void... params) {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return null;

    }

    @Override
    protected void onPostExecute(Void result) {
        finish();

            Intent intent = new Intent(SplashActivity.this,
                    MainActivity.class);
            startActivity(intent);

        }
    }
}
不应该使用睡眠(2000)

使用animationlistener()


当onAnimationEnd被触发时,调用startActivity。

在splash活动中尝试此操作

Button button = (Button)findViewById(R.id.buttonLayout);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(this,TargetActivity.class));
                finish();
            }
        });

假设您希望将第一个活动保留在后台,但不希望线程在第二个活动完成睡眠后立即重新打开它

为了实现这一点,您可以将“thread”设置为自定义
thread
类的全局变量。您可以将其定义为活动的内部类:

MyThread thread;
以及类别定义:

private class MyThread extends Thread
{
    public boolean bRun = true;

    @Override
    public void run()
    {
        try
        {
            sleep(3200);
            if (bRun)
            {
                startActivity(new Intent(getApplicationContext(), Activity2.class));
            }
        }
        catch (InterruptedException e)
        {
            e.printStackTrace();
        }
    }

}
onCreate()
中,您可以编写

thread = new MyThread();
thread.start();
然后您可以像这样更改“onClick”方法:

public void round1(View v){
   if (thread != null && thread.isAlive())
   {
       thread.bRun = false;
   }
   Intent i = new Intent(Qz1.this, Qone.class);
   startActivity(i);
}
public class Test extends AppCompatActivity{

private Handler handler;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Settign the splashscreen with the button i suppose
    setContentView(R.id.splashcreen);
}

@Override
protected void onStart() {
    super.onStart();

    handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            startNextActivity();
        }
    }, 2000);
}

public void startNextActivity(){
    startActivity(new Intent(getApplicationContext(), Qone.class));
}

public void skipSplashScreen(){
    if (handler != null)
        handler.removeCallbacksAndMessages(null);

    startNextActivity();
}

@Override
protected void onStop() {
    super.onStop();
    // clear handler on stop
    if (handler != null)
        handler.removeCallbacksAndMessages(null);
}
}

这将阻止线程启动第二个活动,如果它是通过单击按钮启动的。

我认为这里的最佳实践是使用处理程序

您可以这样做:

public void round1(View v){
   if (thread != null && thread.isAlive())
   {
       thread.bRun = false;
   }
   Intent i = new Intent(Qz1.this, Qone.class);
   startActivity(i);
}
public class Test extends AppCompatActivity{

private Handler handler;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Settign the splashscreen with the button i suppose
    setContentView(R.id.splashcreen);
}

@Override
protected void onStart() {
    super.onStart();

    handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            startNextActivity();
        }
    }, 2000);
}

public void startNextActivity(){
    startActivity(new Intent(getApplicationContext(), Qone.class));
}

public void skipSplashScreen(){
    if (handler != null)
        handler.removeCallbacksAndMessages(null);

    startNextActivity();
}

@Override
protected void onStop() {
    super.onStop();
    // clear handler on stop
    if (handler != null)
        handler.removeCallbacksAndMessages(null);
}
}

当用户按下按钮时,调用SkipSlashScreen(),处理程序将停止,因此计时器将停止,您可以通过调用startTextActivity()方法手动转到下一个活动。

按钮初始化和onclick事件侦听器在哪里?添加剩余代码我尚未初始化按钮。我使用了onClick方法。我必须使用onclick事件监听器吗?使用finish()应该关闭的位置当您的活动将发现您的onClick方法是调用启动活动上的按钮时,此方法不会在单击按钮时停止启动屏幕线程。此方法将不起作用。单击按钮后需要2秒钟时间,因为线程仍在运行,并使活动重新启动线程。bRun=false;这一行显示为错误。建议的更正是重命名该文件。怎么办?@Suresh Anand-“文件”?真奇怪。好的,那就让你的IDE高兴起来,把变量命名为其他的名字,而不是“线程”是的。现在错误是bRun无法解析为字段或不是字段。但您确实使用名为“bRun”的公共布尔变量复制了我的线程版本?@Suresh Anand-好的,我正在解决这个问题-请稍候。我认为线程应该使用内部类。很抱歉,我没有先花时间测试:(