Не хранить activities что это
Перейти к содержимому

Не хранить activities что это

  • автор:

Почему спустя время приложение перезапускается, если его свернуть?

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

Отслеживать
51.6k 199 199 золотых знаков 59 59 серебряных знаков 242 242 бронзовых знака
задан 19 авг 2021 в 6:35
Svetl9chok Svetl9chok
433 2 2 серебряных знака 13 13 бронзовых знаков

Отключить такое поведение нельзя, так работает система Андроид. Она может прибивать ваше приложение, когда вздумается. Наоброт, чтобы сымитировать такое поведение, во время разработки и тестирования полезно включать Don’t keep activities в настройках разработчика.

19 авг 2021 в 11:56

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

19 авг 2021 в 11:58

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Система Андроид не гарантирует, что приложение не будет выгружено из памяти. Для того, чтобы не терять состояние, необходимо его сохранять.

Рассмотрим простой пример. На экране текст и кнопка. Нажатие на кнопку увеличивает счетчик counter на единицу и вставляет в текст.

public class MainActivity extends AppCompatActivity < private TextView textView; private Button button; private int counter; @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button.setOnClickListener(v ->< counter++; updateViews(); >); > private void updateViews() < textView.setText(String.valueOf(counter)); >> 

Каждое нажатие на кнопку — это пользовательский ввод, к нему нужно относиться бережно и не терять то, что вводил пользователь.

Если мы свернем приложение, система Андроид может прибить процесс нашего приложения, если посчитает нужным (например, если на телефоне будет заканчиваться память). Пользовательский ввод будет утерян безвозвратно.

Чтобы устранить этот недостаток, в Активити переопределяем onSaveInstanceState() и сохраняем все, что нам нужно. В нашем случае это текущее состояние счетчика:

 @Override protected void onSaveInstanceState(Bundle state)

Восстанавливаем значение счетчика в методе onCreate() :

 @Override protected void onCreate(Bundle savedInstanceState) < . if (savedInstanceState != null) < counter = savedInstanceState.getInt("com.example.counter"); updateViews(); >> 

Если вы хотите проверить, как будет вести приложение при нехватке памяти, включите на устройстве режим Don’t keep activities («Не сохранять операции») в настройках разработчика.

В таком режиме вы сразу увидите все недостатки вашего приложения при сворачивании и разворачивании.

Можно ли ускорить Android телефон с помощью меню «Для разработчиков»?

Каждый владелец смартфона рано или поздно сталкивается с тем, что его гаджет начинает тормозить и перестаёт работать с той же скоростью как в день покупки. И тут всесильный интернет, по первому запросу предлагает множество советов по оптимизации и ускорению.

Отдельный пласт таких рекомендаций посвящён меню «Для разработчиков», ведь оно присутствует в любом андроид телефоне, а значит интересно каждому пользователю. Эта статья завершает цикл в котором мы разобрали практически каждую настройку этого меню и сегодня речь пойдёт о возможности ускорения телефона.

Я проверил большинство из опубликованных в интернете рекомендаций, провёл тесты и собрал всё в удобном формате, чтобы дать ответ на вопрос обозначенный в заголовке.

Не хранить Activities

Активировав этот пункт вы действительно запретите приложениям занимать место в оперативной памяти, таким образом освободите её.

Но нужно понимать, что даже если вы прямо сейчас закроете все открытые приложения, в системе Android всё равно останется около 50 активных процессов, которые необходимы для нормальной работы смартфона. Поэтому включать эту настройку я настоятельно не рекомендую даже на самых недорогих моделях.

Кстати, настройка «Лимит фоновых процессов», работает по схожему сценарию и используется в при создании системы, чтобы выполнить правильную настройку планировщика (отвечает за распределение ресурсов под каждую конкретную задачу).

Показывать все ANR

Достаточно полезная настройка для владельцев бюджетных смартфонов. Она позволяет выводить на экран предупреждение о том, что какое-то из активных приложений «зависло».

Я активирую этот пункт, так как при тестировании новых версий программ, мне необходимо понимать насколько стабильна их работа. Систему эта настройка никак не нагружает, а информация может оказаться полезна.

Показывать предупреждения канала

Эта настройка Android будет полезна тем у кого возникают трудности с получением уведомлений от приложений.

В момент когда система не сможет вывести на экран смартфона уведомление допустим от «Viber», на дисплее появится код ошибки и если нужно будет, вы сможете найти в интернете решение, воспользовавшись поиском.

Трассировка системы (Размер буфера для каждого процессора)

Для того чтобы понять, действительно ли изменение параметров этой настройки может ускорить смартфон, я устанавливаю «Antutu» и зайдя по пути: Меню «Для разработчиков» —> Трассировка системы —> Размер буфера для каждого процессора, убеждаюсь, что установлены стандартные (для моего смартфона Redmi Note 10 Pro) значения в16 384 КБ.

Затем запускаю тест и получаю следующие результаты:

После этого возвращаюсь в меню и изменяю размер буфера на самые максимальные значения — 65 536 КБ, далее перезагружаю смартфон и снова провожу тестирование.

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

Ответ на вопрос поставленный в заголовке таков: Ускорить смартфон через меню для разработчиков не получится, однако на некоторых моделях, можно добиться снижения нагрева процессора, при выполнении сложных задач (например игр).

Надеюсь статья заслуживает вашего лайка и комментария��

Мы нашли секретный способ управлять фоновыми процессами в телефоне. Показываем

Если вы заметили, что смартфон стал работать медленнее, а некоторые приложения зависают или перестают отвечать, возможно, виной тому являются процессы, которые работают в фоновом режиме и отнимают слишком много ресурсов телефона. В этой статье расскажем как ограничить их работу с помощью скрытой настройки меню.

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

Многие пользователи ошибочно считают, что оперативную память «съедают» те приложения, которые остаются свернутыми, и если их закрыть, можно таким образом освободить бОльшую часть памяти.

На самом деле это не так. Свернутые приложения, находящиеся в режиме ожидания — это лишь верхушка айсберга. По сути – это только кэшированные данные, которые позволяют вам вернуться в приложение без потери последних данных. Закрыв их, вы сможете лишь немного освободить оперативную память телефона. Основная же часть ресурсов приходится на процессы или службы приложений. Именно они потребляют оперативную память и расходуют заряд батареи даже тогда, когда приложение закрыто.

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

Как управлять фоновыми процессами

Получить расширенный контроль над фоновыми процессами можно с помощью специальных инструментов, встроенных в операционную систему. В смартфонах Android эта возможность реализована с помощью скрытого меню для разработчиков.

Как включить параметры разработчика

Для того, чтобы активировать режим разработчика, необходимо перейти в Настройки телефона, открыть пункт «Сведения о телефоне», затем «Сведения о ПО» и несколько раз подряд нажать на пункт «Номер Сборки» до появления системного уведомления о том, что режим разработчика активирован.

Затем нужно вернуться назад, в главные настройки. Если все было сделано правильно, вы увидите, что внизу появился новый пункт меню «Параметры разработчика».

Как управлять фоновыми процессами

Для того, чтобы управлять фоновыми процессами, в меню «Параметры разработчика» необходимо найти пункт «Приложения». Здесь находится несколько параметров, отвечающих за работу фоновых процессов. Например, параметр «Вытеснение фоновых Activity» позволяет принудительно останавливать действия приложений после их закрытия (не рекомендуем включать), а параметр ANR в фоновом режиме — отображать фоновые уведомление в случае, когда какой-то процесс не отвечает.

Больше всего нас здесь интересует параметр «Лимит фоновых процессов», который позволяет выбрать какое количество процессов будет использоваться вашим смартфоном в фоне. Данное ограничение затрагивает в основном сторонние приложения, установленные пользователем, поэтому можно не переживать за работающие системные службы.

По умолчанию здесь установлено значение «Стандартное ограничение».

Для слабых смартфонов с небольшим количеством оперативной памяти можно ограничиться значением «не более 1−2 процессов». Для устройств «пошустрее» можно установить лимит «не более 4 процессов».

Полное отключение фоновых процессов может повлиять на корректную работу некоторых приложений, поэтому мы не рекомендуем использовать данную функцию по максимуму, особенно если вы активно пользуетесь мессенджерами, почтой и другими приложениями, которые требуют проверки уведомлений.

Заключение

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

Настройки и состояние приложения

В одной из предыдущих тем был рассмотрен жизненный цикл Activity в приложении на Android, где после создания Activity вызывался метод onRestoreInstanceState , который восстанавливал ее состояние, а перед завершением работы вызывался метод onSaveInstanceState , который сохранял состояние Actiity. Оба этих метода в качестве параметра принимают объект Bundle , который как раз и хранит состояние activity:

protected void onRestoreInstanceState(Bundle saveInstanceState); protected void onSaveInstanceState(Bundle saveInstanceState);

В какой ситуации могут быть уместно использование подобных методов? Банальная ситуация — переворот экрана и переход от портретной ориентации к альбомной и наоборот. Если, к примеру, графический интерфейс содержит текстовое поле для вывода TextView, и мы программно изменяем его текст, то после изменения ориентации экрана его текст может исчезнуть. Или если у нас глобальные переменные, то при изменении ориентации экрана их значения могут быть сброшены до значений по умолчанию.

Чтобы точнее понять проблему, с которой мы можем столкнуться, рассмотрим пример. Изменим файл activity_main следующим образом:

Здесь определено поле EditText, в которое вводим имя. И также определена кнопка для его сохранения.

Далее для вывода сохраненного имени предназначено поле TextView, а для получения сохраненного имени — вторая кнопка.

Теперь изменим класс MainActivity :

package com.example.settingsapp; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.EditText; import android.widget.TextView; public class MainActivity extends AppCompatActivity < String name ="undefined"; @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); >public void saveName(View view) < // получаем введенное имя EditText nameBox = findViewById(R.id.nameBox); name = nameBox.getText().toString(); >public void getName(View view) < // получаем сохраненное имя TextView nameView = findViewById(R.id.nameView); nameView.setText(name); >>

Для хранения имени в программе определена переменная name. При нажатии на первую кнопку сохраняем текст из EditText в переменную name, а при нажатии на вторую кнопку — обратно получаем текст из переменной name в поле TextView.

Запустим приложение введем какое-нибудь имя, сохраним и получим его в TextView:

Состояние activity в Android и Java

Но если мы перейдем к альбомному режиму, то TextView окажется пустым, несмотря на то, что в него вроде бы уже получили нужное значение:

Состояние Bundle activity в Android и Java

И даже если мы попробуем заново получить значение из переменной name, то мы увидим, что она обнулилась:

Сохранение состояния activity в Android и Java

Чтобы избежать подобных ситуаций как раз и следует сохранять и восстанавливать состояние activity. Для этого изменим код MainActivity:

package com.example.settingsapp; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.EditText; import android.widget.TextView; public class MainActivity extends AppCompatActivity < String name ="undefined"; final static String nameVariableKey = "NAME_VARIABLE"; TextView nameView; @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); nameView = findViewById(R.id.nameView); >// сохранение состояния @Override protected void onSaveInstanceState(Bundle outState) < outState.putString(nameVariableKey, name); super.onSaveInstanceState(outState); >// получение ранее сохраненного состояния @Override protected void onRestoreInstanceState(Bundle savedInstanceState) < super.onRestoreInstanceState(savedInstanceState); name = savedInstanceState.getString(nameVariableKey); nameView.setText(name); >public void saveName(View view) < // получаем введенное имя EditText nameBox = findViewById(R.id.nameBox); // сохраняем его в переменную name name = nameBox.getText().toString(); >public void getName(View view) < // выводим сохраненное имя nameView.setText(name); >>

В методе onSaveInstanceState() сохраняем состояние. Для этого вызываем у параметра Bundle метод putString(key, value) , первый параметр которого — ключ, а второй — значение сохраняемых данных. В данном случае мы сохраняем строку, поэтому вызываем метод putString() . Для сохранения объектов других типов данных мы можем вызвать соответствующий метод:

  • put() : универсальный метод, который добавляет значение типа Object. Соответственно поле получения данное значение необходимо преобразовать к нужному типу
  • putString() : добавляет объект типа String
  • putInt() : добавляет значение типа int
  • putByte() : добавляет значение типа byte
  • putChar() : добавляет значение типа char
  • putShort() : добавляет значение типа short
  • putLong() : добавляет значение типа long
  • putFloat() : добавляет значение типа float
  • putDouble() : добавляет значение типа double
  • putBoolean() : добавляет значение типа boolean
  • putCharArray() : добавляет массив объектов char
  • putIntArray() : добавляет массив объектов int
  • putFloatArray() : добавляет массив объектов float
  • putSerializable() : добавляет объект интерфейса Serializable
  • putParcelable() : добавляет объект Parcelable

Каждый такой метод также в качестве первого параметра принимает ключа, а в качестве второго — значение.

В методе onRestoreInstanceState происходит обратный процесс — с помощью метода getString(key) по ключу получаем из сохраненного состояния строку по ключу. Соответственно для получения данных других типов мы можем использовать аналогичные методы:

  • get() : универсальный метод, который возвращает значение типа Object. Соответственно поле получения данное значение необходимо преобразовать к нужному типу
  • getString() : возвращает объект типа String
  • getInt() : возвращает значение типа int
  • getByte() : возвращает значение типа byte
  • getChar() : возвращает значение типа char
  • getShort() : возвращает значение типа short
  • getLong() : возвращает значение типа long
  • getFloat() : возвращает значение типа float
  • getDouble() : возвращает значение типа double
  • getBoolean() : возвращает значение типа boolean
  • getCharArray() : возвращает массив объектов char
  • getIntArray() : возвращает массив объектов int
  • getFloatArray() : возвращает массив объектов float
  • getSerializable() : возвращает объект интерфейса Serializable
  • getParcelable() : возвращает объект Parcelable

Для примера рассмотрим сохранение-получение более сложных данных. Например, объектов определенного класса. Пусть у нас есть класс User :

package com.example.settingsapp; import java.io.Serializable; public class User implements Serializable < private String name; private int age; public User(String name, int age)< this.name = name; this.age = age; >public String getName() < return name; >public void setName(String name) < this.name = name; >public int getAge() < return age; >public void setAge(int age) < this.age = age; >>

Класс User реализует интерфейс Serializable , поэтому мы можем сохранить его объекты с помощью метода putSerializable() , а получить с помощью метода getSerializable() .

Пусть у нас будет следующий интерфейс в activity_main.xml :

Здесь определены два поля ввода для имени и возраста соответственно.

В классе MainActivity пропишем логику сохранения и получения данных:

package com.example.settingsapp; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.EditText; import android.widget.TextView; public class MainActivity extends AppCompatActivity < User user = new User("undefined", 0); final static String userVariableKey = "USER_VARIABLE"; @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); >// сохранение состояния @Override protected void onSaveInstanceState(Bundle outState) < outState.putSerializable(userVariableKey, user); super.onSaveInstanceState(outState); >// получение ранее сохраненного состояния @Override protected void onRestoreInstanceState(Bundle savedInstanceState) < super.onRestoreInstanceState(savedInstanceState); // получаем объект User в переменную user = (User)savedInstanceState.getSerializable(userVariableKey); TextView dataView = findViewById(R.id.dataView); dataView.setText("Name: " + user.getName() + " Age: " + user.getAge()); >public void saveData(View view) < // получаем введенные данные EditText nameBox = findViewById(R.id.nameBox); EditText yearBox = findViewById(R.id.yearBox); String name = nameBox.getText().toString(); int age = 0; // значение по умолчанию, если пользователь ввел некорректные данные try< age = Integer.parseInt(yearBox.getText().toString()); >catch (NumberFormatException ex)<> user = new User(name, age); > public void getData(View view) < // получаем сохраненные данные TextView dataView = findViewById(R.id.dataView); dataView.setText("Name: " + user.getName() + " Age: " + user.getAge()); >>

Здесь также сохраняем данные в переменную User, которая предварительно инициализированна некоторыми данными по умолчанию. А при нажатии на кнопку получения получем данные из переменной и передаем их для вывода в текстовое поле.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *