2013-12-16 57 views
9

我有一個應用程序,它具有一個用作常規GUI的Activity和一個Service。我的活動有兩個按鈕。一個按鈕停止進程,另一個按鈕終止進程。我分別使用這些方法,來啓動和停止我的過程:Android:如何徹底殺死作爲後臺進程單獨運行的服務?

Intent i = null; 
Button start; 
Button stop; 

public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 

    i = new Intent(this, Service.class); 
    start = (Button) findViewbyId(R.id.start_button); 
    stop = (Button) findViewById(R.id.stop_button); 

    start.setOnClickListener(new OnClickListener(){ 

     public void onClick(){ 
      startService(i); 
     } 
    } 
    stop.setOnClickListener(new OnClickListener(){ 

     public void onClick(){ 
      stopService(i); 
     } 
    } 
} 

這個服務沒有綁定到actvivty或應用程序。我在表現爲如此配置的服務:

<service 
    android:name="com.example.mypackage.Service" 
    android:process=":remote"> 
    <intent-filter> 
     <action 
      android:name="com.example.mypackage.Service" /> 
    </intent-filter> 
</service> 

當我啓動服務運行在它自己的獨立於其他任何東西。意思是,當我開始服務和onDestroy()應用程序時,服務仍在運行。我可以看到它仍在運行,因爲通過adb,我運行了ps命令並且它表示它是。

問題是當我打電話stopService(intent)。當我從活動端調用stopService(intent)時,它將運行服務的onDestroy()中設置的代碼行,但是當我運行psadb時,它表示它仍在運行。

我希望能夠完全銷燬服務。我不確定服務是如何工作的,所以請不要猶豫,去補救。我不確定它是否與我在服務中做的事情有關。謝謝!

編輯: 當我啓動服務,我用的是onStartCommand()和運行一些代碼有它一定支持。我也從onStartCommand()返回START_STICKY。我也試過返回START_NOT_STICKY,並且在我致電startService(intent)後服務仍在運行。

+0

你是如何開始你的服務,我在onStartCommand方法中猜測,你爲你的服務返回START_STICKY,爲什麼在你停止服務之後,它會重新開始,嘗試返回START_NOT_STICKY,希望這有助於你。 – user2652394

+0

@ user2652394是的,我返回'START_STICKY' –

+0

嗯......你在你的onDestroy方法中調用super.onDestroy()嗎? – MobileMon

回答

-1

我認爲你可以在你的清單中設置android:exported="false",以便其他應用程序不能訪問服務,從而啓動服務。我可能需要查看代碼的完整實現以完全確定其原因。我做了同樣的事情,它工作得很好。

4

服務在stopService被調用後停止。停止後,它們不活動,但被緩存。

通過Android文檔他們成爲empty process

不持有任何活動的應用程序組件的過程。保持這種進程的唯一原因是爲了緩存目的,以便在組件需要運行時提高啓動時間。系統經常殺死這些進程,以平衡進程高速緩存和底層內核高速緩存之間的整體系統資源。

服務將保留在緩存中,直到它再次被您的應用程序調用或系統緩存將無法保留空間。 RS命令不知道活動和緩存dprocess之間的區別,並且allways顯示所有令人愉快的進程。如果您刪除:remote這種行爲將保持(注意,單獨的進程將不會創建)

6

如果你想強行殺掉服務過程中,你可以使用下面的代碼:

Process.killProcess(Process.myPid()); 
相關問題