По существу, у вас есть утечка памяти, которая вызвана не отмененным предыдущим Timer
и сохранением ссылки на переменную count
. Вот почему, даже когда Activity уничтожается, ваш старый таймер все еще увеличивает старую переменную count, и когда активность воссоздается, появится новый объект Timer и новая переменная count. Поэтому вы увидите 2 счетчика одновременно.
Решение - отменить таймер, когда активность уничтожена:
@Override
protected void onDestroy() {
super.onDestroy();
timer.cancel();
}
Если вы хотите узнать больше об утечках памяти, вы можете проверить эту статью.
Я не уверен, что ОС Вы идете, но окна отправляет сообщение, что она собирается ввести новое состояние электропитания. Можно прислушаться к этому и затем или начать обрабатывать на ЦП или отклонять просьбу вводить более низкое состояние электропитания.
В пользу пользователей Linux, встречающихся с подобной проблемой, я думал, что добавлю, что, можно получить подобные уведомления и подавить изменения состояния электропитания с помощью API DBUS. Сценарий в качестве примера в Python, взятом из ссылки, для запрещения изменения состояния электропитания:
#!/usr/bin/python
import dbus
import time
bus = dbus.Bus(dbus.Bus.TYPE_SESSION)
devobj = bus.get_object('org.freedesktop.PowerManagement',
'/org/freedesktop/PowerManagement')
dev = dbus.Interface (devobj, "org.freedesktop.PowerManagement.Inhibit")
cookie = dev.Inhibit('Nautilus', 'Copying files from /media/SANVOL')
time.sleep(10)
dev.UnInhibit(cookie)
iPhone - Связь iPhone также может быть выполнена по bluetooth с помощью GameKit .
-121--4156414-Вы можете написать собственный метод расширения, если используете C # 3 +, чтобы помочь вам с этим. Этот код прошел некоторые базовые тесты, чтобы убедиться, что он работает:
public static void AddRange<T>(this ObservableCollection<T> coll, IEnumerable<T> items)
{
foreach (var item in items)
{
coll.Add(item);
}
}
-121--1597717- Согласно MSDN, существует API, который позволяет приложению сообщить Windows, что он все еще работает и что Windows не должна переходить в спящий режим или выключать дисплей.
Функция называется SetThreadExecityState
( MSDN ). Он работает на меня, используя флаги ES _ SYSTEM _ REQUIRED
и ES _ CONTINUOUS
.
Однако обратите внимание, что использование этой функции не останавливает запуск заставки, что может помешать работе приложения OpenGL, если заставка также использует OpenGL (oder Direct3D).