2015-09-17 3 views
6

Это мой Service звонок вызывается при нажатии кнопки с Activity. Если я проведу свой Activity влево, пока работает Service, он сработает. Я также попытался запустить его в отдельном процессе, добавив android:process=":remote" в манифест, но он все тот же.Android-сервис с START_STICKY сбой при убийстве приложения

@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); 

Ошибка я получаю:

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) 

Это null указателя на type = intent.getIntExtra("Type",-1);

Я понимаю, что убийство приложения убивает процесс и Intent это Service становится выходит null. Но как обращаться с такими случаями, что даже если Activity убит Intent передан Service? Я хочу, чтобы сервис полностью не зависел от Activity. Кроме того, я бег это нравится:

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

Возможный дубликат [Что такое исключение NullPointerException и как его исправить?] (Http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i- fix-it) – petey

ответ

3

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

Поскольку вы не выложили возвращаемое значение onStartCommand() я считаю, что это START_STICKY смысл, что служба воссоздана системой с nullIntent прошли в.

Но как обрабатывать такие случаи, даже если деятельность убита, цель передается на службу.

Просто вернуть START_REDELIVER_INTENT флаг, а это значит, что:

«Если система убивает службу после onStartCommand() возвращается, воссоздают службу и вызвать onStartCommand() с последним намерением, которое было поставлено на службу.»

+0

Спасибо. Оно работает. Также подскажите, что произойдет, если я перезагружу телефон во время работы службы, если я использую START_REDELIVER_INTENT? – gandharv09

+0

@newtoandroid Ничего, пока вы не начнете приложение, которое, в свою очередь, начнет обслуживание. Если вы хотите запустить службу при загрузке устройства, взгляните на [Попытка запуска службы при загрузке на Android] (http://stackoverflow.com/questions/2784441/trying-to-start-a-service -он-загрузки на Android? RQ = 1) – Onik

Смежные вопросы