Стек активности не работает так, как предполагается

У меня есть приложение, которое имеет MainActivity.

Если его первый запуск, он запускает действие, которое отображает вводный слайдер, и если это не так, он запускает MainWeatherActivity.

Вот код из MainActivity

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    boolean firstStart = PreferenceManager.getDefaultSharedPreferences(this)
            .getBoolean(PREF_KEY_FIRST_START, true);

    Log.i("MainActivity", "firstStart = " + Boolean.toString(firstStart));

    if (firstStart) {
        Intent i = new Intent(this, MainIntroActivity.class);
        startActivityForResult(i, REQUEST_CODE_INTRO);
    }
    startActivity(new Intent(this, MainWeatherActivity.class));
    finish();
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_CODE_INTRO) {
        if (resultCode == RESULT_OK) {
            PreferenceManager.getDefaultSharedPreferences(this).edit()
                    .putBoolean(PREF_KEY_FIRST_START, false)
                    .apply();
        } else {
            PreferenceManager.getDefaultSharedPreferences(this).edit()
                    .putBoolean(PREF_KEY_FIRST_START, true)
                    .apply();
            //User cancelled the intro so we'll finish this activity too.
            finish();
        }
    }
}

Когда я открываю приложение в первый раз, пользователь должен видеть MainIntroActivity, а затем MainWeatherActivity. Но вместо этого этот код напрямую запускает MainWeatherActivity, а когда я нажимаю кнопку "Назад", запускается MainIntroActivity.

Где я ошибся и как это исправить?

MainIntroActivity

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.i("MainIntroActivity","onCreate");
    addSlide(new SlideFragmentBuilder()
                    .backgroundColor(R.color.colorPrimary)
                    .buttonsColor(R.color.colorAccent)
                    .neededPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION})
                    .image(agency.tango.materialintroscreen.R.drawable.ic_next)
                    .title("title 3")
                    .description("Description 3")
                    .build(),
            new MessageButtonBehaviour(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    showMessage("We provide solutions to make you love your work");
                }
            }, "Work with love"));
}

MainWeatherActivity

        LocationManager mLocationManager;
double latitude, longitude;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main_weather);
    Log.i("MainActivity","onCreate");
    mLocationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
    if (ActivityCompat.checkSelfPermission(MainWeatherActivity.this, android.Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
        Location location = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
        latitude = location.getLatitude();
        longitude = location.getLongitude();
        Toast.makeText(MainWeatherActivity.this,"Successful. Latitude ="+Double.toString(latitude)+" Longitude = "+Double.toString(longitude),Toast.LENGTH_SHORT).show();
        Log.i("MainActivity","Lat = "+latitude+", lon = "+ longitude);
    }else{
        Toast.makeText(MainWeatherActivity.this, "No Permission. Grant Permission to continue", Toast.LENGTH_SHORT).show();
    }

}

РЕДАКТИРОВАТЬ: я забыл упомянуть, что и в IntroActivity и MainActivity в файле манифеста есть noHistory=true.

Надеюсь, вопрос ясен...

2 ответа

Вызов для начала деятельности является асинхронным. Поведение, которое вы видите, может быть из-за этого.

Переместить второй вызов в onActivityResult и к else первого если.

if (firstStart) { 
    Intent i = new Intent(this,       MainIntroActivity.class);
    startActivityForResult(i, REQUEST_CODE_INTRO);
 } else {
    startActivity(new Intent(this, MainWeatherActivity.class));
}
finish();

Попробуйте заменить следующий код:

   if (firstStart) {
        Intent i = new Intent(this, MainIntroActivity.class);
        startActivityForResult(i, REQUEST_CODE_INTRO);
    }else{
        startActivity(new Intent(this, MainWeatherActivity.class));
        finish();
    }
Другие вопросы по тегам