2013-08-03 1 views
1

Я использовал следующий код, чтобы сохранить службу живым:Это правильный трюк, чтобы поддерживать сервис даже при низком давлении в памяти?

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    ... 
    keepServiceAlive(this, 2222); 
    return super.onStartCommand(intent, flags, startId); 
} 
@SuppressWarnings("deprecation") 
public void keepServiceAlive(Service service, int id) { 
    Notification note = new Notification(0, null, System.currentTimeMillis()); 
    note.flags |= Notification.FLAG_NO_CLEAR;   
    service.startForeground(id, note); 
} 

Но иногда служба до сих пор убивают. Не могли бы вы помочь мне подтвердить правильность этого фрагмента кода или предложить лучшее решение?

ответ

1

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

См. this blog post by CommonsWare

+0

Это имеет смысл. Но ключевой вопрос здесь: будет ли ваше предложение дать больше возможностей сделать его живым в условиях низкой памяти? – JackWM

+0

'startForeground()', вероятно, лучшее, что вы могли бы сделать. Я полагаю, если вы действительно хотите, чтобы вы могли запускать повторяющийся сигнал тревоги, который запускает намерение запустить службу, поэтому, если он будет убит, он будет перезапущен при следующем сигнале тревоги. Я бы серьезно подумал, что вам действительно нужно это делать, потому что это может быть что-то, что пользователь хочет отключить или не быть таким настойчивым. – Karakuri