2017-02-15 14 views
1

Я прочел this Ответ, и это не полезно в моем случае.Тест START_STICKY service

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

adb shell am stopservice -n serviceComponent 

onDestroy() называется на службу. Теперь, когда я вернусь Service.START_STICKY от onStartCommand(); Я жду, когда система перезапустит сервис, и он никогда перезапускается.

Это правильное поведение? Я прошел через this вопрос, но не смог найти надежный ответ.

public class SampleService extends Service { 

    private static final boolean LOG = true; 

    public static final String CALLER = "sample.service.caller"; 

    /** 
    * called once when service is created. 
    */ 
    @Override 
    public void onCreate() { 
     super.onCreate(); 
     if(LOG){ 
      log("onCreate() -> thread: %s", Thread.currentThread().getName()); 
     } 
    } // onCreate 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     if(LOG){ 
      log(">>>>>> onStartCommand()"); 
     } 
     if(LOG){ 
      log("thread: %s", Thread.currentThread().getName()); 
     } 

     if(LOG){ 
      log("caller[%s]", intent.getStringExtra(CALLER)); 
     } 

     if(LOG){ 
      log("<<<<<< onStartCommand()"); 
     } 
     return Service.START_STICKY; 
    } // onStartCommand 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     if(LOG){ 
      log("onDestroy() -> thread: %s", Thread.currentThread().getName()); 
     } 
     Toast.makeText(this, "destroying", Toast.LENGTH_SHORT).show(); 
    } // onDestroy 


    @Nullable 
    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } // onBind 

    private void log(String format, Object... args){ 
     Utils.log("SampleService", String.format(format, args)); 
    } // log 

} // SampleService 

Вот что я пытался до сих пор

  • Я запустить службу по телефону с помощью этого кода

    Intent intent = new Intent(this, SampleService.class); 
    intent.putExtra(SampleService.CALLER, "main activity"); 
    if(null == startService(intent)){ 
        if(LOG){ 
         log("startService -> %s", "service not found!"); 
        } 
    
    } // 
    
  • После запуска службы, adb shell dumpsys activity services | grep "com.mallaudin" возвращает эту

    ServiceRecord{8bc884d u0 com.mallaudin.services/.SampleService} 
    intent={cmp=com.mallaudin.services/.SampleService} 
    packageName=com.mallaudin.services 
    processName=com.mallaudin.services 
    baseDir=/data/app/com.mallaudin.services-2/base.apk 
    dataDir=/data/user/0/com.mallaudin.services 
    app=ProcessRecord{b1c1c5a 32017:com.mallaudin.services/u0a94} 
    
  • Теперь я прекращаю обслуживание, вызывая adb shell am stopservice -n com.mallaudin.services/.SampleService. Он останавливает обслуживание, а onDestroy - . Такое же поведение наблюдается, когда я убиваю службу из списка услуг в своем телефоне.

    Stopping service: Intent { cmp=com.mallaudin.services/.SampleService } 
    Service stopped 
    
  • Когда я использую adb shell force-stop com.mallaudin.services команду, служба остановлена, но onDestroy() не называется.

+0

Я использовал 'adb shell am kill com.mallaudin.services', чтобы убить приложение. Он работает сейчас! – mallaudin

ответ

1

START_STICKY документация:

... если процесс этого сервиса будет убит в то время как он начал ...

adb shell am stopservice и context.stopService(Intent) на самом деле не убить процесс обслуживания, а просто останавливает службу при сохранении процесса приложения. Таким образом, система не будет перезапускать сервис в этом случае.

Вы можете попробовать следующее: создать приложение с помощью Activity и Service. Затем запустите действие, запустите службу и убейте приложение, сдвинув его с обзорного экрана (ака меню «Отрезок»). Ваша служба должна перезагрузиться.

+0

Я тестировал его с помощью 'adb shell am fore-stop', который убивает процесс. Также я убил сервис из меню сервисов. – mallaudin

+0

Если это не убивает службу, то почему вызов 'onDestroy' вызывается? Я действительно не понимаю, что происходит! – mallaudin

+0

@mallaudin Я не уверен, что 'force-stop' убивает процесс, но я уверен, что' kill' делает.Обратите внимание, что 'kill' не работает в приложениях на переднем плане – nandsito

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