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

#android #application-design #object-persistence

#Android #приложение-дизайн #объект-постоянство

Вопрос:

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

Комментарии:

1. Я не уверен, что вы подразумеваете под линейным программированием, но это математический термин

Ответ №1:

ОБНОВЛЕНИЕ 10.1.16

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

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

Я установил ДВА флага. Один в onSaveInstanceState в пакете, чтобы знать, что это действительный пакет, установленный мной. Другой в самом классе, чтобы определить, был ли вызван onCreate из-за восстановления или ротации. Итак, в onCreate я проверил, не равно ли значение onSaveInstanceState not null, проверьте флаг пакета и проверьте 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) amp;amp; !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 (Bundle, PersistableBundle) onSaveInstanceState никогда не вызывается, поэтому я не знаю, почему они даже ее реализуют. (?)

ССЫЛКИ:

СОГЛАСНО ДОКУМЕНТАЦИИ ANDROID

onCreate

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

Ответ №2:

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

 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);
}
  

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

Ответ №3:

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

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

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

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

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

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

Используйте finishAffinity() . Это работает на> API 16.

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

Комментарии:

1. нет … перезапустите ВСЕ приложение, предполагая, что мы уже прошли основное (начальное) действие.