Стек активности не работает так, как предполагается
У меня есть приложение, которое имеет 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();
}