2010-09-11 64 views
8

我想用bindService方法創建服務。 但是,當我關閉一個活動我的服務被銷燬,我不想這樣。Android bindService或/和startService

我嘗試使用startForeground(NOTIFICATION_ID, notification); service onCreate將服務置於前臺,但服務仍然銷燬。

現在,我嘗試用電話在同一時間開始服務兩種方式:

Intent bindIntent= new Intent(this, ServiceC.class); 
    startService(bindIntent); 
    bindService(bindIntent, onService, BIND_AUTO_CREATE); 

通過調用這兩個方法服務不被破壞。我的應用程序使用這種方法很好。

有人可以向我解釋這是一種好的方式,或者如果不是這樣,請你給我想一想爲什麼startForeground(NOTIFICATION_ID, notification);不起作用?

什麼是使用bindService的最佳方式,但同時我不希望服務自毀。

+0

我知道這是老問題,但無恥地問有沒有得到任何正確的解決方案使用bindService? – 2013-12-19 11:50:54

回答

7

我使用了相同的解決方案,它是一個合法的解決方案。從Service ref:

服務可以啓動並且有 連接綁定到它。在這種情況下,只要 已啓動,或者存在一個或多個 與 Context.BIND_AUTO_CREATE標誌,系統將保持服務 運行。一旦 這兩種情況都不成立,則 服務的onDestroy()方法被稱爲 ,服務實際上終止於 。

startForeground()不工作,因爲它只是試圖阻止該服務從系統被打死,但其生命週期是另一件事:如果沒有比這更綁定到該服務並沒有啓動,它只是停止。

+0

那麼你聲明那裏沒有使用bindService的解決方案?我們必須將所有的實現從bindService更改爲startService? – 2013-12-19 11:51:52

0

如果使用startService()啓動服務,它不會被銷燬。嘗試啓動一個服務,它擴展了IntentService並在onHandleIntent()中有一個循環。當循環完成時,服務被破壞,並且與Activity完成無關。用戶可以關閉應用程序,但服務不會被終止。

public class MyService extends IntentService 
{ 
    private static final String serviceName = "MyService "; 

    public MyService() { 
    super(serviceName); 
    } 

    @Override 
    public void onDestroy() 
    { 
    Log.v(serviceName, "onDestroy"); 
    Toast.makeText(this, serviceName+" stopped", Toast.LENGTH_LONG).show(); 
    super.onDestroy(); 
    } 

    @Override 
    protected void onHandleIntent(Intent arg0) { 

    long endTime = System.currentTimeMillis() + 30*1000; 
    while (System.currentTimeMillis() < endTime) { 
     synchronized (this) { 
      try { 
       Log.v(serviceName, "Service loop"); 
       wait(1000); 
      } catch (Exception e) { 
      } 
     } 
    } 
    } 

}