2017-01-05 3 views
0

У меня есть нить на странице результатов моего приложения. И он вычисляет значения каждую минуту. Моя проблема заключается в том, когда пользователь закрывает приложение путем прокрутки из последних приложений, поток останавливается. Но он должен работать.Как сохранить поток живым при использовании закрытого приложения с помощью swiping

Я знаю, что могу создать сервис-intenservice для него, но это мое первое приложение, и я написал много кода об этом протекторах, также этот поток изменяет значения на странице результатов. Так что это будет операция для меня.

Я искал его так много, но я не мог найти ответ. Не могли бы вы дать мне совет, если я смогу сохранить эту нить живым?

Благодаря

+0

«также эта нить изменяет значения на странице результатов» - после того, как пользователь очистит вашу задачу, нет «страницы результатов». Эта деятельность будет уничтожена. – CommonsWare

ответ

1

Положите нить в переднем плане Service

Обычно весь VM убит, когда пользователь пойла приложения из списка недавних. Но в последних версиях Android, услуги переднего плана не убиты. (Благодаря Steve M, чтобы довести это изменение до моего сведения.) В более ранних версиях Android даже службы переднего плана были убиты. Это было considered a bug. К сожалению, Google печально известен тем, что неправильно закрывает проблемы как «устаревшие», поэтому нет способа узнать, когда это было фактически исправлено, за исключением тестирования разных устройств. (Или даже если это было намеренно исправлено вообще или случайно зафиксировано в результате каких-либо других изменений.) Я совершенно уверен, что услуги на переднем плане были убиты в Android 4.4. Они не убиты в Android 5.1, по крайней мере, на моих устройствах, включая ту, которая использовалась для работы 4.4. Но обратите внимание на комментарии к этому отчету об ошибках об обслуживании переднего плана в версиях 5.1 и 6.0. Может быть, это никогда не было действительно исправлено, и оно все еще попадало или промахивалось.

Обратите внимание, что независимо от того, убита ли виртуальная машина, всегда будет вызываться onTaskRemoved(...) службы переднего плана.

Вы можете проверить, является ли VM убивается, поместив этот код в деятельности (по крайней мере, в моем тестировании.):

private static final long vmInitTime = System.currentTimeMillis(); 

// in onCreate(...) 
((TextView) findViewById(R.id.timeView)).setText(new Date(vmInitTime).toString()); 

Отображаемое время не изменится до тех пор, как же VM работает , (Или, если быть точнее, до тех пор, пока существует то же определение вашего класса активности. На практике, ClassLoader имеет такое же время жизни, что и VM.)

+0

«Когда пользователь извлекает вашу задачу из ретентатов, весь процесс VM и OS-уровня убивают» - это неверно для многих устройств, возможно, для большинства. –

+0

@SteveM См. Мое редактирование. –

+0

Krumwide Похоже, что вы правы в большинстве случаев, однако, если в процессе приложения есть приложение переднего плана, процесс не будет убит. –

0

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