Невозможно запустить другое действие из вида запуска

Я застрял с интересной проблемой: у меня есть активность типа запуска с Theme.NoDisplay (без пользовательского интерфейса), который должен запускать различные действия в зависимости от некоторых условий, и хотя я звоню startActivity(), он не запустит ни одного из них, если приложение было запущено с помощью значка запуска LauncherActivity но потом умирает без ошибок / исключений).

ТЕМ НЕ МЕНИЕ

Если я начинаю LauncherActivity через АБР или добавить задержку в startActivity() кажется, работает просто отлично.

Вот фрагмент кода.

public class LauncherActivity extends Activity {

private Handler handler = new Handler();
private SharedPreferences preferences;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    preferences = getSharedPreferences(App.getContext().getString(R.string.preferences_name), MODE_PRIVATE);
    int pesel = preferences.getInt(App.getContext().getString(R.string.pref_pesel), 0);
    String password = preferences.getString(App.getContext().getString(R.string.pref_password), "");

    Intent intent;

    if (pesel != 0 && !password.isEmpty()) {
        // TODO: server-side password check
        intent = new Intent(this, MainActivity.class);
    } else {
        intent = new Intent(this, RegisterActivity.class);
    }

    Intent startIntent = getIntent();
    intent.setAction(startIntent.getAction());
    intent.setFlags(startIntent.getFlags());
    if (startIntent.getExtras() != null)
        intent.putExtras(startIntent.getExtras());

    final Intent readyIntent = intent;

    /*
    THIS DOENS"T WORK (WORKS IF STARTED VIA ADB THOUGH)
    */
    startActivity(readyIntent);

    /*
    THIS HOWEVER DOES WORK (ALWAYS)
    */
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            startActivity(readyIntent);
        }
    }, 5000);

    finish();
}

}

1 ответ

Я на самом деле нашел решение сам.

Я следил за этим сообщением в блоге, объясняющем, почему мы должны звонить finish() до onResume() из Theme.NoDisplay Мероприятия.

Чтобы исправить мою проблему, я сделал что-то вроде этого, и это похоже на работу:

@Override
protected void onDestroy() {
    super.onDestroy();
    if (isFinishing() && intent != null) {
        startActivity(intent);
    }
}

К сожалению, у меня нет четкого объяснения, почему, но я все равно оставлю это здесь, может кому-то помочь.

Другие вопросы по тегам