2012-10-02 16 views
17

Byłbym wdzięczny za kilka wskazówek, jak radzić sobie z OS zabijając usługi na długie lata.Najlepsza architektura dla długotrwałej usługi na Androidzie

scenariusz działalności:

Aplikacja nagrywa utwór BTT, które mogą trwać przez kilka godzin. Może również wyświetlać ślad na mapie wraz z odpowiednimi statystykami.

Interfejs użytkownika aplikacji umożliwia użytkownikowi rozpoczęcie/zatrzymanie nagrywania ścieżki i wyświetlanie bieżącego śladu na mapie.

Po zakończeniu rejestracji ścieżki użytkownik może zamknąć aplikację i wyłączyć ekran (aby oszczędzać energię), a tylko usługa pozostanie uruchomiona, aby zachować aktualizację nagrania w bazie danych (pokazane powiadomienie), dopóki użytkownik nie uruchomi ponownie poprosić o zatrzymanie nagrywania, co spowoduje zakończenie usługi.

Problem:

Po zmiennej czasu, która trwa od 40 minut do 1 godziny i pół, obsługa nagrywania ginie bez żadnego ostrzeżenia. Ponieważ wyjazdy BTT mogą trwać kilka godzin, wynik ten jest niekompletny.

Niektóre informacje dodatkowe:

usługa jest uruchomiona z START_STICKY i nabywa PARTIAL_WAKE_LOCK i biegnie w tym samym procesie jako głównej działalności.

Nowe lokalizacje są pobierane (i rejestrowane) według ustalonej przez użytkownika stawki od 1 sekundy do kilku minut. Z dokumentacji systemu Android wiem, że jest to oczekiwane zachowanie systemu operacyjnego dla długotrwałych usług.

Pytanie:

Jakie jest najlepsze podejście do projektowania architektury mieć dobrze wychowane aplikację, która mogłaby zaspokoić wymagania scenariuszu biznesowym?

Mogę myśleć o kilka opcji (i nie lubię żadnego z nich), ale chciałbym wskazówek od kogoś, jak już wychodził i rozwiązać podobny problem:

  • odbiornik używają rozgłaszania (idealnie połączone z Menedżerem lokalizacji, jeśli jest to możliwe), aby usługa działała tylko po uzyskaniu nowej lokalizacji ?
  • Nie należy zezwalać użytkownikowi na opuszczenie głównego działania (co powoduje, że użytkownik odczuwa przyjemność)?
  • Czy odbiornik radiowy ponownie uruchamia usługę w razie potrzeby?

Dziękuję wszystkim, którzy mogą podzielić się mądrością na ten temat.

Odpowiedz

9

Mam aplikację, która robi bardzo podobne rzeczy. Upewniam się, że usługa nadal działa, czyniąc ją zadaniem na pierwszym planie.Kiedy jestem gotowy do rozpoczęcia pracy, wzywam tę funkcję, która określa również się powiadomienie:

void fg() { 
    Notification notification = new Notification(R.drawable.logstatus, 
        "Logging On", System.currentTimeMillis()); 
    Intent notificationIntent = new Intent(this, LoggerActivity.class); 
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, 
        notificationIntent, 0); 
    notification.setLatestEventInfo(this, "Logger","Logger Running", 
       pendingIntent); 
    startForeground(1, notification); 
} 

a następnie opuścić tryb pierwszoplanowy po zalogowaniu się skończył:

stopForeground(true); 
+0

Thanks Michael. Mam zamiar przetestować to, a dam ci znać wynik. – Luis

+0

Działa bez przerwy przez wiele godzin. Zostało to rozwiązane :-) Dziękuję Michaelowi. – Luis

+0

Cieszę się, że mogę pomóc! – Michael

Powiązane problemy