#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. нет … перезапустите ВСЕ приложение, предполагая, что мы уже прошли основное (начальное) действие.