2015-06-21 103 views
-1

我在Service中有BroadcastReceiver當廣播接收機在服務中註冊時無法停止服務

我註冊服務的oncreate()方法類似接收器,

final MyReceiver myReceiver = new MyReceiver(); 
@Override 
public void onCreate() { 
    IntentFilter filter = new IntentFilter(SOME_FILTER); 
    registerReceiver(myReceiver, filter); 
} 

然後我創建註銷接收器和停止服務等的方法,

public void stopService(){ 
    if(myReceiver != null){ 
     try{ 
      unregisterReceiver(myReceiver); 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 
    stopSelf(); 
} 

不會停止的服務。有也不例外,沒有錯誤。只是服務不會停止。

我也試了一下下面的方式,

public void stopService(){ 
    if(myReceiver != null){ 
     try{ 
      unregisterReceiver(myReceiver); 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 
    stopForeground(true); 
    stopSelf(); 
} 

通過這種服務的通知被在前臺運行皮,但服務的onDestroy()不會被調用。

我也試圖把代碼註銷接收機onDestroy()但調用stopSelf()方法onDestroy()永遠不會被調用後。

如果我沒有在註冊該服務的BroadcastReceiver,一切工作完全正常,服務站和onDestroy()被調用,但是當我註冊receiver那麼它不會停止。

任何想法這裏發生了什麼?

編輯

這是怎麼了綁定和啓動服務

Intent serviceIntent = new Intent(MainActivity.this, MyService.class); 
bindService(serviceIntent, mConnection, Context.BIND_AUTO_CREATE); 
startService(serviceIntent); 

這是mConnection

MyService myService; 

private ServiceConnection mConnection = new ServiceConnection() { 
    @Override 
    public void onServiceConnected(ComponentName className, IBinder service){ 
     LocalBinder binder = (LocalBinder) service; 
     myService = binder.getService(); 
     isBound = true; 
    } 
    @Override 
    public void onServiceDisconnected(ComponentName arg0) { 
     isBound = false; 
    } 
}; 

下面是我是怎麼解除綁定服務,並停止它。

if(isBound){ 
    unbindService(mConnection); 
    isBound = false; 
} 

myService.stopService(); 
myService = null; 
+0

如何啓動'Service'並在哪裏調用'stopService()'(btw不是一個好名字,因爲'ContextWrapper'中有一個類似於不同參數的方法)。另外,你是否在任何地方綁定了「服務」? –

+0

@ci_我已將代碼添加到問題中。 – gprathour

+0

你正在提供不完整的代碼,什麼是playerService?你爲什麼不發佈一個工作的客戶和服務代碼? – pskink

回答

0

剛剛通過命中和試用方法找到了相同的解決方案。

我將代碼轉換爲unregisterreceiveronDestroy()方法並且全部正常工作。

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    if(myReceiver != null){ 
     try{ 
      unregisterReceiver(myReceiver); 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 
} 

我想問題出現了,因爲我正試圖在停止服務之前取消註冊接收器。

0

雖然Service被綁定,就永遠不會被破壞。

http://developer.android.com/reference/android/app/Service.html

服務可以同時起步,並沒有綁定到它的連接。在這種情況下,只要系統啓動,或者存在與Context.BIND_AUTO_CREATE標誌的一個或多個連接,系統就會繼續運行該服務。一旦這些情況都不成立,就會調用服務的onDestroy()方法,並且服務被有效終止。從onDestroy()返回後,所有清理(停止線程,取消註冊接收者)應該完成。

雖然這是完全可以擁有一個Service既,約束,並開始,它使玄乎的生命週期管理問題(如你剛剛發現)。如果可能,您應該決定是否需要鬆散或緊密耦合您的Service,然後分別使用開始或綁定Service。這會讓你的生活更輕鬆。

+0

我首先解除連接,然後停止服務,查看我更新的問題。和**一切工作正常,如果我只是刪除'BroadcastReceiver' **。 – gprathour