2015-11-09 99 views
1

我正在使用LocalBroadcastReceiver將消息從IntentService發送到活動。我有一個基本的活動,我的項目中的所有活動都繼承自包含以下活動代碼的活動。還有一個由WakefulBroadcastReceiver初始化的基本IntentService,它包含下面的服務代碼。LocalBroadcastManager.sendBroadcast不觸發BroadcastReceiver onReceive

在我的活動,我有:

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    LocalBroadcastManager.getInstance(this).registerReceiver(
      mMessageReceiver, new IntentFilter("push-message")); 
    super.onCreate(savedInstanceState); 
} 
@Override 
protected void onPause(){ 
    LocalBroadcastManager.getInstance(this).unregisterReceiver(
      mMessageReceiver); 
    super.onPause(); 
} 
@Override 
protected void onResume(){ 
    super.onResume(); 
    LocalBroadcastManager.getInstance(this).registerReceiver(
      mMessageReceiver, new IntentFilter("push-message")); 
} 
    private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     String message = intent.getStringExtra("message"); 
     Log.d("receiver", "Got message: " + message); 
    } 
}; 

而在我的服務,我有:

public class SimpleMessagerService extends IntentService { 
public SimpleMessagerService() { 
    super("SimpleMessagerService"); 
} 
@Override 
protected void onHandleIntent(Intent intent) { 
    Intent newintent = new Intent("push-message"); 
    // You can also include some extra data. 
    String message = intent.getExtras().getString("message"); 
    newintent.putExtra("message", message); 


    LocalBroadcastManager.getInstance(this).sendBroadcast(intent); 
} 
} 

服務onHandleIntent被觸發,當我把一個破發點中它和評估表達式:LocalBroadcastManager.getInstance(this);我可以在mReceivers列表中看到mMessageReceiver;然而,當我在mMessageReceiver的onReceive中放置斷點時,我發現它永遠不會被觸發。

更多信息: 看來我的服務在被調用時不能主動執行任何操作,但不會拋出異常。我嘗試在應用程序文件中保存當前上下文,並從服務中拋出Toast消息。這個過程似乎成功了,但從不出現吐司消息。這是我在該服務的清單:

<service 
     android:name="packagename.services.SimpleMessagerService" 
     android:exported="false"> 
</service> 
+1

你已經註冊清單中的接收器? –

+1

您不需要在清單中註冊Receiver。你是否在單獨的進程中運行服務?廣播時您的活動是否在前臺運行? –

+0

至少是它的擴展。我的所有活動都從該活動繼承。這可能是問題嗎? –

回答

1

事實證明一些事情出錯了。首先出口需要在清單中爲真。其次,因爲服務是在不同的線程比主活動的工作,所以爲了廣播傳送給他們的意圖服務,我必須使它看起來像:

Handler mHandler = new Handler(getMainLooper()); 
     mHandler.post(new Runnable() { 
      @Override 
      public void run() { 
        Intent newintent = new Intent("push-message"); 
        newintent.putExtra("message", message); 
        LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(newintent); 
      } 
     }); 

所以主線程擊中。我希望這能幫助有同樣問題的其他人。 我想信貸的rubenlop88張貼這種解決方案在螺紋類似的問題, java.lang.RuntimeException: Handler (android.os.Handler) sending message to a Handler on a dead thread

相關問題