Программное обеспечение VM отлично справляется с сохранением состояния, когда вы «выключаете его», позволяя мгновенно и немедленно вернуться в это предыдущее состояние.
Есть ли какое-нибудь приложение для Windows, которое позволяет мне делать то же самое для любого произвольного программного обеспечения? Это позволило бы мне сохранить / восстановить состояние, возможно, с помощью команды оболочки или кнопки, которая добавляется в каждое окно.
Изменить: для ясности, есть два типа приложений: те, которые сохраняют свои собственные состояния, и те, которые сохраняют состояния других. Те, которые сохраняют свое собственное состояние, похожи на Chrome, который при загрузке перезагружает окна, которые вы открывали в прошлый раз.
Это не то, о чем я спрашиваю; Я спрашиваю о приложении, которое может сохранить состояние других приложений, вроде программного обеспечения VM; но для любого приложения. (Тривиальным тестом было бы загрузить notepad++, набрать кучу вещей и сохранить состояние; при сбросе состояния вы должны иметь возможность многоуровневой отмены большей части того, что вы написали, как будто вы никогда не закрываете приложение.)
Продлить жизнь батареи iPhone Отключить не нужное!
изменён ashes999 245
задан ashes999 245
4 ответа 4
Без виртуализации единственным вариантом в Microsoft Windows является приостановка / возобновление работы приложений. Утилиты, которые могут сделать это PySuspend и Pausep. Это не позволит вам выполнить какую-либо «отмену».
Хотя существуют продукты для виртуализации, такие как QubesOS, которые могут делать то, что вы ищете для систем Linux, вы вряд ли увидите это в Microsoft Windows без прямой поддержки со стороны Microsoft. Однако даже с QubesOS должна быть возможность запустить продукт виртуализации, такой как VirtualBox или VMWare Workstation, для запуска приложений Windows. Вы также можете запускать приложения Windows через Wine, используя все преимущества абстракции QubesOS.
В качестве альтернативы, вы можете запустить несколько виртуальных машин под отдельной копией Windows под каждой из них. Некоторые версии MS Windows позволяют запускать одну или несколько копий ОС, виртуализированных, под одной лицензией.
ответ дан ewindisch 716
С риском быть убитым голосом, я считаю, что должен дать отрицательный ответ.
Многие люди хотели бы этого, в том числе и я. Я также долго искал такой продукт, прежде чем понял, что он не существует, и действительно не может существовать. Возможно, возможны ограниченные реализации приостановки / отмены приостановки, но не общие.
Подумайте, например, о приостановке работы приложения, имеющего открытый файл на компакт-диске, или об открытом интернет-соединении. Теперь представьте, что нужно сделать, чтобы «приостановить» и «приостановить» его: все файлы и подключения будут сохранены при приостановке, а затем при повторном создании приостановки, может быть проверен привод компакт-дисков и открыт файл, восстановлены подключения к Интернету. — устанавливается со всеми данными для входа на сайт и т. д.
Как сохранить личные файлы и программы при обновлении с Windows 7 до Windows 10, восстановлении 10
Это слишком сложно реализовать в любой операционной системе, и это также будет дырой в безопасности, исключающей необходимость входа в систему, если состояние приложения было «захвачено» сразу после входа в систему. Чтобы правильно приостановить приложение, нужно просто сохранить состояние всей операционной системы (которая существует).
Источник: poweruser.guru
Настройки и состояние приложения
В одной из предыдущих тем был рассмотрен жизненный цикл Activity в приложении на Android, где после создания Activity вызывался метод onRestoreInstanceState , который восстанавливал ее состояние, а перед завершением работы вызывался метод onSaveInstanceState , который сохранял состояние Actiity. Оба этих метода в качестве параметра принимают объект Bundle , который как раз и хранит состояние activity:
protected void onRestoreInstanceState(Bundle saveInstanceState); protected void onSaveInstanceState(Bundle saveInstanceState);
В какой ситуации могут быть уместно использование подобных методов? Банальная ситуация — переворот экрана и переход от портретной ориентации к альбомной и наоборот. Если, к примеру, графический интерфейс содержит текстовое поле для вывода TextView, и мы программно изменяем его текст, то после изменения ориентации экрана его текст может исчезнуть. Или если у нас глобальные переменные, то при изменении ориентации экрана их значения могут быть сброшены до значений по умолчанию.
Чтобы точнее понять проблему, с которой мы можем столкнуться, рассмотрим пример. Изменим файл activity_main следующим образом:
Здесь определено поле EditText, в которое вводим имя. И также определена кнопка для его сохранения.
Далее для вывода сохраненного имени предназначено поле TextView, а для получения сохраненного имени — вторая кнопка.
Теперь изменим класс MainActivity :
Для хранения имени в программе определена переменная name. При нажатии на первую кнопку сохраняем текст из EditText в переменную name, а при нажатии на вторую кнопку — обратно получаем текст из переменной name в поле TextView.
Запустим приложение введем какое-нибудь имя, сохраним и получим его в TextView:
Но если мы перейдем к альбомному режиму, то TextView окажется пустым, несмотря на то, что в него вроде бы уже получили нужное значение:
И даже если мы попробуем заново получить значение из переменной name, то мы увидим, что она обнулилась:
Чтобы избежать подобных ситуаций как раз и следует сохранять и восстанавливать состояние activity. Для этого изменим код MainActivity:
В методе 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 пропишем логику сохранения и получения данных:
Здесь также сохраняем данные в переменную User, которая предварительно инициализированна некоторыми данными по умолчанию. А при нажатии на кнопку получения получем данные из переменной и передаем их для вывода в текстовое поле.
Источник: metanit.com
Как сохранять состояние приложения, чтобы не было лага?
Приложение работает в реальном времени. У него есть очень сложное и большое состояние в виде древовидной структуры, которая постоянно меняется. Причем, меняются не только значения полей, но и сама структура: например, в массивах могут появиться или исчезнуть элементы или может измениться их сортировка. Графы и хеш-таблицы тоже подвержены всевозможным изменениям.
Попытка сериализовать всю эту структуру целиком (во что-то типа JSON или BSON) занимает несколько секунд.
Как сохранить состояние, не прерывая работу приложения?
- Вопрос задан более трёх лет назад
- 355 просмотров
Комментировать
Решения вопроса 2
Разработчик
Используйте fork, дочерний процесс за счёт механизма Copy-on-Write в наследство практически бесплатно получает копию памяти родителя (это если у вас Linux).
Такой подход позволяет сделать fork, после этого в родительском процессе заниматься дальнейшей работой, а в дочернем не торопять дампить что нужно на диск.