2015-09-17 40 views
6

To jest moje Service wywoływanie kliknięcia przycisku od Activity. Jeśli przesuję mój Activity w lewo podczas działania Service, ulega awarii. Próbowałem również uruchomić go w oddzielnym procesie, umieszczając w manifeście android:process=":remote", ale wciąż jest taki sam.Usługa Android z START_STICKY awarią podczas zabijania aplikacji

@Override 
public void onCreate(){ 
    super.onCreate(); 
    Log.d("Service", "Creating"); 
} 

@Override 
public IBinder onBind(Intent intent) { 
    // TODO: Return the communication channel to the service. 
    return null; 
} 

@Override 
public int onStartCommand (Intent intent, int flags, int startId) 
{ 
    super.onStartCommand(intent, flags, startId); 

    Log.d("Started", "Service"); 

    type = intent.getIntExtra("Type",-1); 
    mode = intent.getIntExtra("Mode",-1); 
    rank = intent.getIntExtra("Rank", -1); 
    latitude = intent.getDoubleExtra("Lat", -1.0); 
    longitude = intent.getDoubleExtra("Long", -1.0); 
    startTime = intent.getLongExtra("Start", 0); 
    endTime = intent.getLongExtra("End", 0); 

Błąd otrzymuję to:

java.lang.RuntimeException: Unable to start service [email protected] with null: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.content.Intent.getIntExtra(java.lang.String, int)' on a null object reference 
     at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2913) 
     at android.app.ActivityThread.access$2100(ActivityThread.java:148) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1390) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:135) 
     at android.app.ActivityThread.main(ActivityThread.java:5312) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696) 
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.content.Intent.getIntExtra(java.lang.String, int)' on a null object reference 
     at com.routofy.routofytest.MyLocationService.onStartCommand(MyLocationService.java:89) 
     at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2896) 
at android.app.ActivityThread.access$2100(ActivityThread.java:148) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1390) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:135) 
at android.app.ActivityThread.main(ActivityThread.java:5312) 
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696) 

To null wskaźnik na type = intent.getIntExtra("Type",-1);

Rozumiem, że zabijanie aplikację zabija proces i Intent to Service jest coraz wychodzi być null. Ale jak poradzić sobie z takimi przypadkami, że nawet jeśli Activity zostanie zabity Intent zostanie przekazany do Service? Chcę, aby usługa była całkowicie niezależna od Activity. Również używam to lubią:

Intent pickIntent = new Intent(getApplicationContext(),MyLocationService.class); 
+0

Możliwy duplikat [Co to jest wyjątek NullPointerException i jak mogę go naprawić?] (Http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-andhow-do-i- fix-it) – petey

Odpowiedz

3

Rozumiem, że zabijanie aplikacji jest zabicie procesu i intencji usługa ta jest coraz zbliża się zerowa.

Ponieważ nie napisali wartość zwracaną onStartCommand() wierzę, że to START_STICKY oznacza, że ​​usługa jest odtwarzany przez układ z nullIntent przeszedł w.

Ale jak obsługiwać takie przypadki, że nawet jeśli działalność jest zabijana, zamiar zostaje przekazany do służby.

Wystarczy powrócić START_REDELIVER_INTENT flagę, co oznacza, że: „Jeśli system zabija usługę po onStartCommand() zwrotów, ponownie usługę i wywołać onStartCommand() z ostatniego intencyjny, który został dostarczony do serwisu”

+0

Dzięki. To działa. Także jakaś wskazówka co się stanie, jeśli ponownie uruchomię telefon, gdy usługa będzie działać, jeśli użyję funkcji START_REDELIVER_INTENT? – gandharv09

+0

@newtoandroid Nic, dopóki nie uruchomisz aplikacji, która z kolei rozpoczyna usługę. Jeśli chcesz uruchomić usługę podczas uruchamiania urządzenia, zapoznaj się z [Próbując uruchomić usługę przy starcie na Androida] (http://stackoverflow.com/questions/2784441/trying-to-start-a-service -on-boot-on-android? rq = 1) – Onik