2017-01-15 15 views
0

Эта проблема немного отличается от большинства проблем с отображением тостов. Я не прошу отображать сообщения Toast в других действиях , но видеть сообщения с тостами, отправленные фоновым сервисом, в то время как в другом мероприятии кроме Основная деятельность. Я вижу сообщения Toast в основном действии!Сообщение тоста из фона отображается только во время основной деятельности; а не другие виды деятельности

У меня есть приложение, которое имеет фоновое обслуживание. Когда в этой фоновой службе происходят определенные события, отображается сообщение Toast. Фоновая служба получает данные от внешних устройств BT и BLE и отправляет сообщения через Wi-Fi. Тост-сообщения показывают определенные важные события в этих процессах. MainActivity и справочная служба используют контекст приложения из getApplicationContext() для отображения этого сообщения с тостом.

Однако эти сообщения не отображаются, если я перехожу на другой номер Activity. Например, чтобы настроить некоторые параметры. Я не пытаюсь отображать тосты из других видов деятельности; что я могу сделать. Но как я могу получить тост-сообщения из фоновой службы, чтобы отображать, пока я еще в Activity, кроме MainActivity? Я думаю, что мне нужно будет сделать что-то вроде «запустите действие в контексте приложения», хотя я не знаю, как это сделать (или даже если это возможно).

+2

укажите свой код –

ответ

1

Для этого используется BroadcastReceiver. В каждом из ваших Activity вам нужно объявить BroadcastReceiver следующим образом.

private class ShowToastBroadcastReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     String message = intent.getStringExtra("Message"); 
     Toast.makeText(OtherActivity.this, message, Toast.LENGTH_LONG).show(); 
    } 
} 

Вы должны зарегистрировать BroadcastReceiver каждый раз, когда в вашем onResume и отменить его обратно в onPause функции вашей деятельности.

// This is in your Activity 

private ShowToastBroadcastReceiver showToastBroadcastReceiver; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    showToastBroadcastReceiver = new ShowToastBroadcastReceiver(); 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    LocalBroadcastManager.getInstance(this).registerReceiver(showToastBroadcastReceiver, new IntentFilter("SHOW_TOAST")); 
} 

@Override 
public void onPause() { 
    super.onPause(); 
    LocalBroadcastManager.getInstance(this).unregisterReceiver(showToastBroadcastReceiver); 
} 

Теперь вам нужно отправить трансляцию из вашего Service, чтобы получить тост будет показана в Activity.

// This is in your Service 

Intent intent = new Intent("SHOW_TOAST"); 
intent.putExtra("Message", "This toast needs to be shown"); 
LocalBroadcastManager.getInstance(this).sendBroadcast(intent); 
+0

Reaz, у меня нет проблем с отправкой сообщений Toast с моей службы. Я вижу их в порядке, НО ТОЛЬКО ПО МОЕЙ ОСНОВНОЙ ДЕЯТЕЛЬНОСТИ (я использую широковещательный приемник в одном случае и обработчик в другом). Это не проблема. Когда я перехожу к другому действию, скажу, что смотрю на вывод отладки, я больше не вижу эти сообщения, хотя служба продолжает работать, и сообщения Toast продолжают посылаться. Я знаю, что это так, потому что он продолжает работать с внешними устройствами. –

+0

Вы пытались отправить трансляцию? Вы регистрировали трансляцию в любом другом действии? –

+0

Вы нашли ответ для меня, потому что я сделал что-то действительно глупое. Не регистрировать приемник Broadcast, а в его регистрации. У меня был последний слишком высокий уровень. Мне нужно было положить его в onDestroy, а не onStop(). Какой я идиот! –

0

Вы должны быть в состоянии отображать Toast из любого контекста, в том числе Service. Руководство Toast Notifications разработчик имеет пример кода, который показывает, как:

Context context = getApplicationContext(); 
CharSequence text = "Hello toast!"; 
int duration = Toast.LENGTH_SHORT; 

Toast toast = Toast.makeText(context, text, duration); 
toast.show(); 

Другими словами, вам не нужно Activity вообще. Вы можете отобразить Toast непосредственно с Service. Если вы беспокоитесь о том, чтобы делать это из отдельного потока, создайте Handler в главном потоке Service и отправьте сообщение Runnable или сообщение этому обработчику, чтобы отобразить Toast.

Еще одна возможность заключается в том, что вы используете связанный сервис, и он уходит, когда вы переключаетесь с основного действия. Убедитесь, что сама служба все еще работает.

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

+0

Спасибо Теду, но это не проблема. Я показываю сообщения Toast из фоновой службы, которая никогда не исчезает с использованием широковещательного приемника, а в другом случае - обработчика. Я знаю, что сервис не уходит, потому что он успешно обменивается данными с внешним устройством. Но я вижу только эти сообщения Toast во время моей основной деятельности. Если мне нужно перейти от моей основной деятельности к другой деятельности, например, для настройки некоторых параметров или просмотра некоторого отладочного вывода, я больше не вижу эти сообщения Toast, хотя они отправляются. –

0

Благодаря Reaz я нашел тупую ошибку, которую я совершил. Я не регистрировал BroadcastReceiver, обрабатывая Toasts на onStop() вместо onDestroy(). Перемещение без регистрации на onDestroy() и регистрация и фильтры на onCreate() решили проблему.

Смежные вопросы