Перезапуск приложения, не беспокоясь о onSaveInstanceState

Как мне просто перезапустить мое ВСЁ приложение, вместо того, чтобы беспокоиться о сохранении экземпляра в onSaveInstanceState и повторной инициализации всего при возобновлении / восстановлении в onRestoreInstanceState? (это может быстро стать склонным к ошибкам)

3 ответа

ОБНОВЛЕНИЕ 10.1.16

Я решил сделать это в onCreate, так как onRestoreInstanceState иногда ведет себя странно.

Этот метод основан на том факте, что onCreate (Bundle) имеет значение null, если только активность не восстанавливается, и в этом случае это значение устанавливается в onSaveInstanceState(Bundle).

Я установил ДВА флага. Один в onSaveInstanceState в Bundle, чтобы знать, что это действительный Bundle, установленный мной. Другой в самом классе, чтобы определить, был ли вызван onCreate из-за отдыха или ротации. И поэтому в onCreate я проверил, является ли onSaveInstanceState не нулевым, проверил флаг Bundle и проверил bInit (который по умолчанию равен false). Если оба флага имеют значение true, то это означает, что Android выгружал и уничтожал память наших приложений, и самый безопасный способ гарантировать, что все снова инициализируется в приложении в линейном стиле, - просто перезапустить его и запустить начальное действие.

public class SomeMiddleActivity extends AppCompatActivity
{
    private static boolean bInit = false; // only way it will be false again is if android cleared our memory and we are recreating

    @Override
    public void onSaveInstanceState(Bundle state)
    {
        // set a flag so that onCreate knows this is valid
        state.putBoolean("StateSaved", true);
        super.onSaveInstanceState(state);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        // this must be called first always for some reason
        super.onCreate(savedInstanceState);

        if (savedInstanceState != null)
        {
            if (savedInstanceState.getBoolean("StateSaved", false) && !bInit)
            {
                // we were recreated... start app over
                Intent intent = new Intent(getApplicationContext(), Startup.class);
                startActivity(intent);
                finish();
                return;
            }
        }

        bInit = true; // this will stay true until android has cleared our memory

        .......
    } 

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

И к вашему сведению: версия onSaveInstanceState onSaveInstanceState (Bundle, PersistableBundle) никогда не вызывается никогда, поэтому я не знаю, почему они даже реализуют ее. (?)

РЕКОМЕНДАЦИИ:

В соответствии с андроидной документацией

OnCreate

Bundle: Если действие повторно инициализируется после предыдущего выключения, тогда этот Bundle содержит данные, которые он недавно предоставил в onSaveInstanceState(Bundle). Примечание: в противном случае это ноль.

Попробуйте реализовать этот способ

private final String IS_RE_CREATED = "is_re_created";

@Override
public void onSaveInstanceState(Bundle outState) {
    outState.putBoolean(IS_RE_CREATED, true);
    super.onSaveInstanceState(outState);
}

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

    if (savedInstanceState.containsKey(IS_RE_CREATED)) {
        boolean isRecreated = savedInstanceState.getBoolean(IS_RE_CREATED, false);
        if (isRecreated) restartApplication(this);
    }
}

public void restartApplication(Context context) {

    String packageName = context.getPackageName();
    PackageManager packageManager = context.getPackageManager();

    // Intent to start launcher activity and closing all previous ones
    Intent restartIntent = packageManager.getLaunchIntentForPackage(packageName);
    restartIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    restartIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    context.startActivity(restartIntent);

    // Kill Current Process
    Process.killProcess(Process.myPid());
    System.exit(0);
}

Примечание: принудительный перезапуск приложения не рекомендуется.

Как мне просто перезапустить мое приложение вместо того, чтобы беспокоиться о сохранении экземпляра

Вы имеете в виду текущую деятельность? Ничего не делать onSaveInstanceState а также onRestoreInstanceState).

Действие создается автоматически, когда происходят изменения. Если нет сохраненного состояния экземпляра, действие не восстановит никаких данных.

Редактировать:

Я думаю, что столкнулся с подобной проблемой слишком несколькими неделями ранее, где я должен был убить все действия в заднем стеке и открыть новый новый вид деятельности.

// Start Main Activity
Intent intent = new Intent(this, MainActivity.class);
finishAffinity();
startActivity(intent);

использование finishAffinity(), Это работает на> API 16.

Когда вы убиваете все действия в заднем стеке и открываете основное действие, это похоже на перезапуск вашего приложения.

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