Я не понимаю, как работают андроиды.Активность в Android-качестве случайно Создана и уничтожена
У меня есть активность и каждый раз в то время я заметил, что, когда мое приложение переходит на задний план, андроид разрушает то, что текущая деятельность является (скажем Activity3) и несколько других одиночек и объектов и т.д. То отлично , Проблема заключается в том, когда приложение возобновляется, тогда интуиция подсказывает мне, что, поскольку андроид уничтожил активность и объекты для памяти или что-то еще, тогда андроид полностью перезапустит приложение полностью с Activity1, чтобы все объекты и члены данных получили надлежащую инициализацию.
НЕ ТАК!
Кажется, что когда мое приложение возобновляется, Activity3 воссоздан и OnCreate вызывается с теми же параметрами, как это было в первый раз (когда он был вызван из деятельности2) только на этот раз все синглтоны и другие объекты, которые были инициализированы в Activity1 и Activity2 воссозданы с их значениями по умолчанию и оказываются бесполезными.
Как это безопасная политика/техника? Как андроид может случайно уничтожить объекты и действия, а затем, когда пользователь возобновит, просто вызовите onCreate в недавнем действии и ожидайте, что все будет тяжелым, а НЕ нужно пройти надлежащую процедуру запуска/инициализацию?
UPDATE/РЕШЕНИЕ
Благодаря к commentors за отличную информацию.
СОГЛАСНО ANDROID ДОКУМЕНТАЦИИ
OnCreate
Bundle: Если активность повторной инициализации после того, как ранее закрываются, этот Bundle содержит данные, которые он совсем недавно поставляемые в onSaveInstanceState (Bundle). Примечание: В противном случае оно равно null.
ПОЭТОМУ, что я в конечном итоге делает это я поставил два флага. Один в onSaveInstanceState в комплекте, чтобы знать, что это действительный комплект, установленный мною. Другой в своем классе, чтобы определить, был ли onCreate вызван из-за отдыха или Автоматическое вращение. И так в onCreate Я проверил, если onSaveInstanceState не имеет значения null, проверьте флаг Bundle и отметьте bInit (по умолчанию это значение false). Если оба флага верны, это означает, что андроид сбрасывал и уничтожал нашу память приложений, а самый безопасный способ убедиться, что все снова инициализировано в приложении с линейным стилем, - это просто перезапустить его и запустить начальную активность.
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
.......
}
Хотя это сработало до сих пор, если у кого есть другое предложение, дайте мне знать. Я опубликую еще одну статью об этом.
И FYI:onSaveInstanceState (Bundle, PersistableBundle) версия onSaveInstanceState никогда не называли когда-либо, так что я не знаю, почему они даже реализовать. (?)
@goldenb @Rishabh Благодаря goldenb и Rishabh для проницательности.
Пожалуйста, удалите 'SOLVED' из вашего названия и опубликовать решение, которое вы нашли в качестве надлежащего ответ (то есть, если это не совсем то же самое, что и один из ответов). – usr2564301
почта, где? .... – zdanman
В большой пустой коробке с надписью «Ваш ответ», ниже данных решений. – usr2564301