2013-03-18 12 views
9

Jestem nowym użytkownikiem Androida. Zajmuję się tworzeniem aplikacji rejestrującej dane z czujników. Mam działanie z dwoma przyciskami. Kiedy użytkownik naciśnie przycisk Start, chcę uruchomić usługę i zarejestrować dane czujnika, dopóki użytkownik nie naciśnie przycisku zatrzymania. Nie jestem pewien, jakiego rodzaju usługi chcę użyć. Czytałem o lokalnych i zdalnych usługach, ale nie całkiem zrozumiałem różnicę.Ponowna instalacja usługi Android po zabiciu aplikacji

Co próbowałem dotąd:

Założyłem działalność z dwoma przyciskami, które uruchamiać i zatrzymywać usługi lokalne:

//Start Service 
startService(new Intent(this, MyService.class)); 

//Stop Service 
stopService(new Intent(this, MyService.class)); 

stworzyłem również lepką usługę, która onStartCommand() zaczynający się zalogować czujnik dane:

public int onStartCommand(Intent intent, int flags, int startId) { 
    mSensorManager.registerListener(this, accelerometer, 
      SensorManager.SENSOR_DELAY_FASTEST); 
    mSensorManager.registerListener(this, magnetometer, 
      SensorManager.SENSOR_DELAY_UI); 
    mSensorManager.registerListener(this, lightSensor, 
      SensorManager.SENSOR_DELAY_UI); 
    Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show(); 
    return Service.START_STICKY; 
} 

AndroidManifest.xml:

<service android:name=".MyService" android:enabled="true" android:process=":HelloSensors_background"/> 

Działa dobrze, jednak problem polega na tym, że po uruchomieniu usługi kill the application usługa ta jest ponownie uruchamiana i traci wszystkie wcześniej zarejestrowane dane. Co powinienem użyć, aby mieć usługę, która działa płynnie i nadal działać, nawet jeśli aplikacja zostanie zabita, aby nie utracić żadnych zarejestrowanych danych?

+1

Co masz na myśli przez zabicie aplikacji? Jeśli użytkownik przejdzie do strony ustawień aplikacji i wybierze opcję "Wymuś zatrzymanie", usługa zostanie zatrzymana, nic nie da się z tym zrobić. – Premsuraj

+0

[To] (http://www.youtube.com/watch?v=XVyXCrM-3zw) jest tym, co rozumiem przez zabicie aplikacji – user1135357

+0

Po drugie pytanie, co masz na myśli mówiąc "zabić aplikację"? Chciałbym jednak zaznaczyć, że usługa _can_ może być oddzielona od aplikacji w taki sposób, że jeśli użytkownik zatrzyma funkcję _app_, usługa_usługa_ będzie mogła nadal działać. –

Odpowiedz

11

Po wyjaśnienia dotyczące zabijania:

Prawdopodobnie chcesz uruchomić Service w innym procesie niż Application, co można osiągnąć przez taką deklarację w swoim manifeście:

<service 
    android:name=".ServiceClassName" 
    android:process=":yourappname_background" > 
    ... 

użytku ten sam atrybut android:process dla dowolnych deklaracji receiver w twoim manifeście.

Jeśli chcesz otrzymywać tylko zdarzenia, które można zadeklarować w manifeście, możesz rozważyć użycie numeru IntentService, który prawie nigdy nie będzie widoczny dla użytkownika z powodu jego krótkiego czasu działania. Jeśli jednak chcesz słuchać zdarzeń, które mogą być odbierane tylko podczas programowego rejestrowania odbiorców (w takim przypadku oczywiście klauzula receiver w manifeście nie ma sensu), nie możesz zrobić nic przeciwko użytkownikowi (lub jednemu z " zabójcy inteligentnych aplikacji ") zabijając twoją usługę. Zaletą jest jednak to, że użytkownicy mają nadzieję, że Twoja aplikacja może zostać zabita, podczas gdy Twój Service nie może (jeśli chcą, aby coś zrobiła).

Dodatkowo możesz bring your Service to the foreground.

+2

Przeniesienie usługi na pierwszy plan rozwiązało mój problem. Wielkie dzięki :) – user1135357

+0

Skąd wziąłeś to miejsce w OnTaskRemoved()? –

+0

@ user1135357 może być nieświadomy twojego pytania, jeśli nie wpisujesz aliasu takiego jak ja tutaj, TaRanLaYal. - To smutne, że odnośnik w mojej odpowiedzi jest dziś częściowo uszkodzony, ale sam możesz znaleźć sekcję na stronie. Tak czy inaczej, może użytkownik1135357 może rzucić nieco światła na swoje konkretne rozwiązanie. –

-3

Myślę, że musisz zadeklarować usługę w AndroidManifest.xml.

+1

True; i jak to się odnosi do pytania? –

+0

Cóż, to było to samo, co pod warunkiem, z wyjątkiem braku kodu ode mnie (nie mam własnego kodu pod ręką, aby uzyskać dostęp). Muszę zrobić coś podobnego w jednej z moich aplikacji, dlatego nie wymagałem wyjaśnień; Zrozumiałem, o co chodziło użytkownika. Mówiąc to, nie mogłem podać tak szczegółowej odpowiedzi jak ty, ponieważ wciąż jestem całkiem nowy na Androida. Mogłem jednak wyjaśnić powody tego wymogu. Przepraszam za to. –

Powiązane problemy