猿问

为什么每次更改启动屏幕时我的应用程序都会从​​后台打开?

我创建了一个包含 3 个启动画面的应用程序。它们在 10 秒后出现并消失,下一个取代它,直到第三个结束,然后主活动打开,应用程序正常运行。


问题是,如果用户在任何这些启动屏幕期间将应用程序发送到后台,则 10 秒后,即使用户正在使用另一个应用程序,应用程序也会回到前台并显示下一个启动屏幕或主要活动。


我查看了代码,似乎找不到任何可以解释这一点的内容。在 Android Studio 更新到 3.5 之前它工作正常,我不知道为什么会导致这个问题。


public class  loadScreen extends AppCompatActivity {

private int SLEEP_TIMER = 3;


@Override

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);




    requestWindowFeature(Window.FEATURE_NO_TITLE);

    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,

                            WindowManager.LayoutParams.FLAG_FULLSCREEN);

    setContentView(R.layout.activity_load_screen);

    LogoLauncher logoLauncher = new LogoLauncher();

    logoLauncher.start();

}


private class  LogoLauncher extends Thread{

    public void run(){

        try{

            sleep(3000 * SLEEP_TIMER);

        }catch(InterruptedException e)

        {

            e.printStackTrace();


        }

        Intent intent = new Intent(loadScreen.this, createdby.class);

        startActivity(intent);

        loadScreen.this.finish();



    }

}


@Override

public void onBackPressed() {


}

}

我希望如果应用程序在启动画面序列期间在用户返回时被发送到后台,它将从他们离开的地方恢复。


白衣非少年
浏览 133回答 2
2回答

Qyouu

您的问题是即使您的应用程序在后台,也会调用 startActivity。这将在调用时打开您的应用程序。因此,您需要在该部分中创建一些逻辑来检查是否允许调用 startActivity 方法。编辑:用于检查活动的待启动的代码。试试这个!private static final String PENDING_LAUNCH_KEY = "PENDING_LAUNCH";private boolean pendingLaunch;private boolean activityPaused;@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    if (savedInstanceState != null) {        pendingLaunch = savedInstanceState.getBoolean(PENDING_LAUNCH_KEY);    }    requestWindowFeature(Window.FEATURE_NO_TITLE);    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,                        WindowManager.LayoutParams.FLAG_FULLSCREEN);    setContentView(R.layout.activity_load_screen);    if (!pendingLaunch) {        LogoLauncher logoLauncher = new LogoLauncher();        logoLauncher.start();    }}@Overrideprotected void onResume() {    activityPaused = false;     if (pendingLaunch) {        pendingLaunch = false;        startAndFinish();    }}@Overrideprotected void onPause() {    activityPaused = true;}@Overridepublic void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {    outState.putBoolean(PENDING_LAUNCH_KEY, pendingLaunch);    super.onSaveInstanceState(outState, outPersistentState);}private class  LogoLauncher extends Thread{    public void run(){        try{            sleep(3000 * SLEEP_TIMER);        }catch(InterruptedException e)        {            e.printStackTrace();        }        if (activityPaused) pendingLaunch = true;        else startAndFinish();    }}private void startAndFinish() {    Intent intent = new Intent(loadScreen.this, createdby.class);    startActivity(intent);    finish();}

慕虎7371278

即使用户正在使用另一个应用程序,该应用程序也会将自己带回前台即使您的应用程序进入后台,您的线程仍在运行!解决方案是,您必须在方法中使用terminate该线程onPause它将从他们离开的地方恢复。飞溅活动public class SplashActivity extends AppCompatActivity {private Handler handler = null;private long SPLASH_TIMEOUT = 5000;@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_splash);    handler = new Handler();}private Runnable splashRunnable = new Runnable() {    @Override    public void run() {        Intent mySuperIntent = new Intent(SplashActivity.this, SplashActivity1.class);        startActivity(mySuperIntent);        finish();    }};@Overrideprotected void onPause() {    super.onPause();    handler.removeCallbacks(splashRunnable);}@Overrideprotected void onResume() {    super.onResume();    handler.postDelayed(splashRunnable, SPLASH_TIMEOUT);}}SplashActivity1与SplashActivity 相同的代码只会intent发生变化。import android.content.Intent;import android.os.Handler;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;public class SplashActivity1 extends AppCompatActivity {private Handler handler = null;private long SPLASH_TIMEOUT = 5000;@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_splash1);    handler = new Handler();}private Runnable splashRunnable = new Runnable() {    @Override    public void run() {        Intent mySuperIntent = new Intent(SplashActivity1.this, MainActivity.class);        startActivity(mySuperIntent);        finish();    }};@Overrideprotected void onPause() {    super.onPause();    handler.removeCallbacks(splashRunnable);}@Overrideprotected void onResume() {    super.onResume();    handler.postDelayed(splashRunnable, SPLASH_TIMEOUT);}}
随时随地看视频慕课网APP

相关分类

Java
我要回答