2016-09-26 164 views
0

我有一項服務,每訂閱一個活動每10秒鐘一次。 這是我服務的定義:服務onStop不會停止服務

public class MyService extends Service { 

private final static String TAG = "AccountSummaryService"; 
public static final String BROADCAST_ACTION = "com.mypackage.mobile"; 
private Handler handler = new Handler(); 
private final int delayedStartupTime = 1000; 
private Intent intent; 

@Override 
public void onCreate() { 
    super.onCreate(); 
    intent = new Intent(BROADCAST_ACTION); 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    handler.postDelayed(broadcast, 1000); 
    return START_STICKY; 
} 

private Runnable broadcast = new Runnable() { 
    @Override 
    public void run() { 
     sendBroadcast(intent); 
     handler.postDelayed(this, 10000); 
    } 
}; 

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

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    this.stopSelf(); 
    handler.removeCallbacksAndMessages(broadcast); 
} 

在我的活動我註冊/啓動和註銷/在我的onResume /的onPause方法停止servince。 他們被稱爲所以下面的代碼實際上得到執行:

//in the onCreate 
Intent anIntent = new Intent(activity, MyService.class); 

@Override 
public void onResume() { 
    super.onResume(); 
    startSummaryRefreshService(); 
} 

@Override 
public void onPause() { 
    super.onPause(); 
    stopSummaryRefreshService(); 
} 

private void startSummaryRefreshService() { 
    activity.startService(anIntent); 
    activity.registerReceiver(myReceiverObject, new IntentFilter(RefreshUIService.BROADCAST_ACTION)); 
} 

public void stopSummaryRefreshService() { 
    activity.unregisterReceiver(myReceiverObject); 
    activity.stopService(anIntent); 
} 

的問題是,即使stopService()被調用的服務仍然運行,當我重新註冊我的接收機它被多次調用。

基本上......我無法阻止服務。我一直在嘗試很多StackOverflow解決方案,但是......沒辦法。

我該怎麼弄錯?

+0

什麼你的意思是什麼時候你「重新註冊我的接收器」?你如何做到這一點?你是否再次展示相同的活動?還有,你爲什麼要用「活動」來調用啓動/停止方法?什麼是活動參考?從活動代碼外面調用它? –

+0

好問題。它實際上不是重新開始活動,而是一個片段。 – user2274307

+0

需要詳細說明?或發佈更多代碼? –

回答

0

感謝您的回答傢伙。問題在於計時器。 onDestroy()被正確調用,但我定義的循環的方式創建了一個無限循環,因爲runnable是一個對象本身,與服務分離(實際上與onDestroy()一起被殺死,並且一旦啓動後每10秒就會被重新創建)

-1

您的全部綁定是否已關閉?

服務可以以兩種方式使用。您可以綁定到使用startService()啓動的服務。比如,後臺服務可以通過調用帶有Intent對象的startService()來啓動,該對象標識要執行的下載。只有稍後,可能當用戶想要對該下載進行一些控制或獲得有關下載的信息時,活動會通過調用bindService()來建立與該服務的連接。在這種情況下,stopService()不會實際上停止服務,直到最後一個綁定關閉。

所有bindService()調用都有相應的unbindService()調用後,服務將關閉。如果沒有綁定的客戶端,那麼當且僅當有人在服務上調用startService()時,服務還需要stopService()。

所以,這裏有幾種可能性:

1)你還是約束客戶端(例如,其他活動),在這種情況下,直到他們解除綁定

2你不能停止服務)由於兩個unbindService()和stopService()是異步的,在某些情況下可能會隨着時間的推移而失控,在這種情況下,如果您從ServiceConnection的onServiceDisconnected()方法調用stopService(),則可能會獲得更好的運氣。

此外,請記住,服務被銷燬的確切時間取決於android操作系統,可能不會立即。因此,例如,如果您依賴onDestroy()使您的服務停止正在完成的某些工作,請考慮使用另一個觸發器(例如,通過服務聯編程序接口調用stopDoingStuff()方法的活動)。

+0

onBind返回null,所以沒有綁定。 –

+0

爲什麼downvote?我已經解釋了服務綁定的概念。 –

+0

文檔也一樣。你的回答與問題無關。 OP的服務在'onBind'方法中返回'null',這意味着服務不能被綁定。如果你打算說「它可能會幫助別人」,這不是第一次討論綁定服務。請保持網站清潔。謝謝。 –

0

你的問題是在這裏:

所有的
public void onDestroy() { 
    super.onDestroy(); 
    this.stopSelf(); 
    handler.removeCallbacksAndMessages(broadcast); 
} 

首先,你不需要從onDestroy()中調用this.stopSelf()因爲當Service已經停止onDestroy()被調用。

其次,撥打removeCallbacksAndMessages(broadcast)並不會刪除您發佈到HandlerRunnable。這就是爲什麼,即使在您停止Service之後,您仍然每10秒鐘收到一次廣播IntentremoveCallbacksAndMessages()的參數不是Runnable,而是「令牌」(您沒有使用)。

要解決您的問題,請撥打removeCallbacks(broadcast)。此方法將Runnable作爲參數,並將從Handler(這是您想要執行的操作)中刪除已發佈的Runnable