2016-11-04 71 views
0

當我的服務正在運行時,我可以在屏幕上看到我的應用程序,一切正常。我的服務發送廣播消息,我可以在我的「MainActivity」中看到它們。但只要我按下主頁按鈕,並且我的應用程序不再處於前景,它就會停止。該服務仍在運行,但廣播沒有達到我的「死亡」或「暫停」應用程序。這是我的代碼:android:如何在應用程序不活動時接收服務的廣播

主要活動:

onCreate: 

Intent intent = new Intent(getApplicationContext(), MainGate_Service.class); 
startService(intent); 

@Override 
protected void onStart() { 
    super.onStart(); 

    LocalBroadcastManager.getInstance(this).registerReceiver(ServiceReceiver, new IntentFilter("MainGate_ring")); 
} 


@Override 
protected void onStop() { 
    super.onStop(); 

    LocalBroadcastManager.getInstance(this).unregisterReceiver(ServiceReceiver); 
} 


private BroadcastReceiver ServiceReceiver = new BroadcastReceiver() { 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     String message = intent.getStringExtra("ServiceMessage"); 

     if(message != null) { 
      if(alarmActive && message.equals("ring")) 
       new soundPlayer().execute(); 
     } 

     setNoti(message); 

    } 

服務:

@Override 
protected void onHandleIntent(Intent intent) { 

    ring = rcv_ring(); 

    Intent ServiceIntent = new Intent("MainGate_ring"); 
    ServiceIntent.putExtra("ServiceMessage", ring); 
    LocalBroadcastManager.getInstance(this).sendBroadcast(ServiceIntent); 


} 
+1

我認爲你的邏輯有一些問題。無論你需要做什麼,你爲什麼不在服務內部做到這一點? –

+0

只是註冊您的接收器清單不在活動內。 – Radhey

回答

0
onStop#LocalBroadcastManager.getInstance(this).unregisterReceiver(ServiceReceiver); 

literally註銷接收器。所以沒有接收機接收來自服務的廣播消息。

0

的問題是在這裏

@Override 
protected void onStop() { 
    super.onStop(); 

    LocalBroadcastManager.getInstance(this).unregisterReceiver(ServiceReceiver); 
} 

Activity.onStart()

的onCreate(捆綁)後調用 - 或之後onRestart()時,活動已經停止,但現在是再次顯示給用戶。緊接着是onResume()。

Activity.onStop()

,當你不再對用戶可見調用。接下來您將接收onRestart(),onDestroy()或任何內容,具體取決於以後的用戶活動。


因此,一旦你離開你的活動onStop()叫你註銷你的接收器。

請勿將您的註銷代碼放在onDestroy()之內,因爲它可能會也可能不會被調用,並且Activity可能會在不調用它的情況下被殺死。

正如@Naveen Dissanayake所建議的,您可能想要重新考慮您的邏輯。

0

您註冊您的BroadcastReceiver內部活動,所以它將取決於Activity的生命週期。當你按下返回按鈕時,活動進入「停止」狀態 - 調用onPause和onStop方法。 Android也可以在資源不足的情況下銷燬此活動。 服務,另一方面,我的嗅覺是無限地運行,即使當UI還沒有準備好時。如果您希望收到來自Activity的通知,則有兩個 可能的解決方案: - 在應用程序實例中創建,存儲和管理BroadcastReceiver - 應用程序類仍在運行,直到您的應用程序被銷燬。當服務通知您某些操作時,您似乎想要播放聲音。 在onCreate中註冊BroadcastReceiver並在onDestroy中取消註冊通知。 - 另一種解決方案 - 如果您想觸發某個動作或IntentService,則對該廣播作出反應,則使用另一個服務。 我會考慮解決方案 - 創建一些ResponseService,將其與MainGate_Service(從應用程序)一起啓動,並從應用程序中停止它。在該服務中註冊BroadcastReceiver,或者,如果您希望在應用程序未運行時啓動,則將IntentFilter添加到清單中。在您的活動中,綁定到該服務。 Serive會知道是否附加了某個UI(如果綁定了Activity),並且如果是,則會通知活動。如果它不 - 會做一些其他的事情(也許,顯示通知)

0

每當你按下home鍵onStop獲得通話,那裏你註銷接收器,所以沒有廣播接收器誰可以接收廣播。

LocalBroadcastManager.getInstance(this).unregisterReceiver(ServiceReceiver); 

從onStop()移除上面的行,或者在服務停止時取消註冊。

相關問題