2017-02-15 141 views
1

我已閱讀this答案,在我的情況下它沒有用。測試START_STICKY服務

我已經創建了一個簡單的服務,它只是記錄方法名。我從我的活動運行它,並通過使用

adb shell am stopservice -n serviceComponent 

onDestroy()殺死它被稱爲上的服務。現在,我已經從onStartCommand()返回Service.START_STICKY;我等待系統重新啓動 服務,它從未重新啓動。

這是正確的行爲嗎?我已經通過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外殼殺死com.mallaudin.services'來殺死應用程序。它現在有效! – mallaudin

    回答

    1

    START_STICKY文檔:

    ...如果同時啓動該服務的過程中被殺害......

    adb shell am stopservicecontext.stopService(Intent)實際上不殺服務過程中,而只是停止服務,同時保持應用程序進程運行。所以在這種情況下系統不會重新啓動服務。

    您可以嘗試以下操作:使用ActivityService創建應用程序。然後啓動該活動,啓動該服務,並通過從概覽屏幕(即最近的菜單)中滑動來終止應用程序。你的服務應該重啓。

    +0

    我已經通過'adb shell am fore-stop'測試了它,這會殺死進程。我也殺了服務菜單中的服務。 – mallaudin

    +0

    如果它不殺死服務,那麼爲什麼'onDestroy'被調用?我真的不知道發生了什麼事! – mallaudin

    +0

    @mallaudin我不確定'強制停止'是否會殺死這個進程,但是我確信'kill'會這樣做。請注意,'kill'在前臺應用程序上無效 – nandsito