2016-11-04 2 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 (Bundle) - или после onRestart(), когда деятельность была остановлена, но сейчас снова отображается пользователю. За ним последует onResume().

Activity.onStop()

не Вызывается, когда вы больше не видны пользователю. Затем вы получите либо onRestart(), onDestroy(), либо ничего, в зависимости от более поздней активности пользователя.


Итак, как только вы оставите вашу деятельность onStop() называется, и вы разрегистрировать приемник.

Не помещайте свой незарегистрированный код в onDestroy() либо потому, что он может быть или не быть вызван, а Activity может быть убит без его вызова.

Как было предложено @Naveen Dissanayake, возможно, вы захотите пересмотреть свою логику.

0

Вы регистрируете свою деятельность BroadcastReceiver внутри, поэтому она будет зависеть от жизненного цикла Activity. Когда вы нажимаете кнопку «Назад», активность переходит в состояние «остановлено» - вызываются методы onPause и onStop. Android также может уничтожить эту активность, в ней мало ресурсов. Службы, с другой стороны, я плачу, чтобы бегать inndefinetely, даже когда ui не готов. Если вы хотите получать уведомления от Activity, есть два возможных решения: - Создание, хранение и управление BroadcastReceiver в экземпляре приложения. Похоже, вы хотите играть звук, когда сервис уведомляет вас о некоторых действиях. Регистрация BroadcastReceiver в onCreate и unregister в onDestroy в уведомлениях. - Другое решение - используйте другую услугу, если вы хотите вызвать какое-либо действие или IntentService, реагируя на эту трансляцию. Я рассмотрю решение - создайте ResponseService, запустите его вместе с вашим MainGate_Service (из приложения) и остановите его из приложения. В этом Service register BroadcastReceiver или добавьте IntentFilter в манифест, если вы хотите, чтобы он запускался, даже если приложение не запущено. В своей деятельности привязайтесь к этой службе. Serive будет знать, прикреплен ли какой-либо пользовательский интерфейс (если активность привязана), и, если это так, будет уведомлять активность. Если это не так - сделайте некоторые другие вещи (возможно, покажите уведомление)

0

всякий раз, когда вы нажимаете кнопку «домой», onStop получает звонок, и там вы не регистрируете приемник, чтобы не было широковещательного приемника, который может получать трансляцию.

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

Удалите вышеуказанную строку с onStop() или отмените регистрацию при каждом прекращении обслуживания.