仅在启动应用程序时显示启动画面,而不是每次调用包含启动画面代码的 activity 时显示启动画面

Display splash screen only when the app is launched and not every time when the activity containing splash screen code, is called

在我开始按问题描述之前,我想指出我知道其他线程问这个问题,但是 none 对我来说已经能够解决我的问题。

之前问的问题和我的问题之间的区别是我在主 activity 中有闪屏代码,在另一个 activity 中有 NOT,所以我没有布局 XML 文件。

所以,问题是,我只想在应用程序启动时显示启动画面,这可以通过以下代码完美完成,但是当 main activity(包含启动画面代码)被调用时另一个 activity 使用 Intent,启动画面再次显示。

所以,首先我尝试使用 flag 变量,在创建 activity 时启动 0 并在显示启动画面一次时将其递增 1。但我发现它不会工作,因为在创建 activity 时它总是 0

所以,现在我正在尝试从另一个 activity 传递一个字符串,并尝试再次阻止启动画面,如以下代码所示:

public class Registration extends ActionBarActivity {

public final static String EXTRA_MESSAGE = "com.kaushal.myapplication.MESSAGE";

DatabaseHelper myDb;
EditText username,password;
private ImageView splashImageView;
boolean splashloading = false;
int flag=0;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_registration);


    String message = null;
    Intent intent0 = getIntent();
    message = intent0.getStringExtra(Registration.EXTRA_MESSAGE);//string from another activity.

    if(!message.equals("signup has called me")) { //splash screen code in `if`
        splashImageView = new ImageView(this);
        //splashImageView.setBackgroundColor();
        splashImageView.setImageResource(R.drawable.sexy);
        setContentView(splashImageView);
        splashloading = false;
        Handler h = new Handler();

        h.postDelayed(new Runnable() {
            public void run() {
                splashloading = false;
                setContentView(R.layout.activity_registration);
                username = (EditText) findViewById(R.id.username);
                password = (EditText) findViewById(R.id.password);
            }
        }, 3000);
        flag++;
    }

    if(flag==0){
        username = (EditText) findViewById(R.id.username);
        password = (EditText) findViewById(R.id.password);
    }

    myDb = new DatabaseHelper(this);




}
}

这里 Registration 是我的主 activity 的名称,它在应用程序启动时启动。

另一个名为 sign Up 的 activity 传递字符串的方法代码:

 public void backToRegistration(View view){
    Intent intent0 = new Intent(this,Registration.class);
    intent0.putExtra(EXTRA_MESSAGE, "signup has called me");
    startActivity(intent0);
}

这个方法有什么问题?应用程序在启动后立即崩溃。

所以像这样在 Intent 中使用字符串作为标志存在许多问题。字符串并不是真正为它设置的。开销比简单的原始布尔标志多一点。

按照您目前尝试的方式进行操作

将您的 onCreate 代码更改为此

super.onCreate(savedInstanceState);

Intent intent0 = getIntent();
boolean showSplash = getIntent().getBooleanExtra(Registration.FLAG_KEY), true);

handleSplashScreen(showSplash);

并添加这个方法,我们将以某种递归的方式使用它来处理启动画面的显示。

private void handleSplashScreen(boolean showSplash){
    if(showSplash) { //splash screen code in `if`
        splashImageView = new ImageView(this);
        //splashImageView.setBackgroundColor();
        splashImageView.setImageResource(R.drawable.sexy);
        setContentView(splashImageView);
        splashloading = false;
        Handler h = new Handler();

        h.postDelayed(new Runnable() {
           public void run() {
               handleSplashScreen(false);
           }
        }, 3000);
    }
    else{
        splashloading = false;
        setContentView(R.layout.activity_registration);
        username = (EditText) findViewById(R.id.username);
        password = (EditText) findViewById(R.id.password);
    }
}

然后,当您从另一个 activity 打开此 activity 时,请执行

public void backToRegistration(View view){
    Intent intent0 = new Intent(this,Registration.class);
    intent0.putExtra(FLAG_KEY, false);
    startActivity(intent0);
}

其中 FLAG_KEYprivate static FLAG_KEY = com.kaushal.myapplication.FLAG; 并替换 EXTRA_MESSAGE 字符串。

我建议怎么做

现在,话说回来,这根本不是我推荐的做法。您应该只需要一个启动时调用的 SplashScreenActivity 并重定向到您的 Registration MainActivity。这摆脱了具有两个不同布局、标志等的 Activity 的卷积

public class SplashScreenActivity extends Activity{

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);

        new Handler().postDelayed(new Runnable(){
            @Override
            public void run(){
                startActivity(new Intent(SplashScreenActivity.this, MainActivity.class);
                SplashScreenActivity.this.finish();
            }
        }, 3000);

    }
}

其中 R.layout.activity_splash 看起来像这样

<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:src="R.drawable.sexy"
    android:scaleType="centerInside" />

然后你可以像这样拥有 MainActivity

public class MainActivity extends ActionBarActivity{

    // Variables here
    ...

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_registration);

        username = (EditText) findViewById(R.id.username);
        password = (EditText) findViewById(R.id.password);
    }

    // Other methods
    ...
}

最后,只需进入清单并对其进行更新,以便在启动时显示新创建的 SplashScreenActivity,并确保 MainActivity 仍被正确声明。

<activity
    android:name=".SplashScreenActivity"
    android:label="@string/app_name">

    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

<activity
    android:name=".MainActivity"/>

没有更多的标志,没有更多的逻辑,没有更多的问题。它在启动时加载启动画面,仅此而已。 Activity 在通过意图后完成,因此它不再在堆栈中。一切都很好。其他问题处理这样的事情的原因是它是启动画面的推荐方式。