Перезапуск приложения, не беспокоясь о 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.
Когда вы убиваете все действия в заднем стеке и открываете основное действие, это похоже на перезапуск вашего приложения.