2017-01-15 9 views
0

この問題は、ほとんどの「ディスプレイトースト」の問題とは少し異なります。私は他の活動でトーストメッセージを表示するように要求していませんしかし、別の活動中にバックグラウンドサービスによって送信されたトーストメッセージを見てください以外の主な活動。私は主な活動のトーストメッセージを見ます!背景からのトーストメッセージは、主なアクティビティでのみ表示されます。他のアクティビティではない

バックグラウンドサービスを持つアプリケーションがあります。このバックグラウンドサービスで特定のイベントが発生すると、トーストメッセージが表示されます。バックグラウンドサービスは、外部のBTおよびBLEデバイスからデータを受信し、wifi経由でメッセージを送信します。トーストメッセージは、これらのプロセスにおいて特定の重要なイベントを示します。 MainActivityとバックグラウンドサービスは、getApplicationContext()のアプリケーションコンテキストを使用してこのトーストメッセージを表示します。

ただし、別のActivityに移動すると、これらのメッセージは表示されません。たとえば、いくつかのパラメータを設定します。私は他の活動からのトーストメッセージを表示しようとしていません。私ができること。しかし、MainActivity以外のActivityにいる間に、バックグラウンドサービスからのトーストメッセージを表示するにはどうしたらいいですか?私はそれをどうやって(たとえそれが可能であっても)わからないが、「アプリケーションコンテキストでアクティビティを実行する」のようなことをする必要があると思う。

+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(); 
    } 
} 

あなたonResumeBroadcastReceiverたびに登録して、あなたの活動の機能でそれを戻って登録を解除する必要があります。

// 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); 
} 

は、今すぐあなたのActivityに示すことが乾杯を得るためにあなたのServiceからブロードキャストを送信する必要があります。

// 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、私のサービスからトーストメッセージを送信する際に問題はありません。私はそれらをうまく見るのですが、私の主な活動の間だけです(私は放送受信機を1つのケースで、ハンドラを別のもので使用します)。それは問題ではありません。デバッグ出力を見て、別のアクティビティに移動したときに、サービスが引き続き動作し、Toastメッセージが引き続き送信されても​​これらのメッセージは表示されなくなりました。私はそれが外部の装置で動作し続けるため、そうであることは分かっています。 –

+0

ブロードキャストを送信しようとしましたか?他のすべての活動に放送を登録しましたか? –

+0

私は本当のばかげた何かをしたので、私の答えが見つかりました。放送受信機を登録するのではなく、登録解除します。私は後者を高すぎるレベルにしていました。 onStop()ではなくonDestroyに配置する必要がありました。私はどんな馬鹿だった! –

0

あなたはService含め、どのコンテキストからToastを表示することができるはずです。

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

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

言い換えれば、あなたはまったくActivityを必要としない:Toast Notifications開発者ガイドは方法を示すサンプルコードが含まれています。 Serviceから直接Toastを表示できます。別のスレッドから実行することを心配している場合は、HandlerをメインスレッドのServiceに作成し、Runnableまたはそのメッセージを投稿してToastを表示してください。

もう1つの可能性は、バインドされたサービスを使用していて、主なアクティビティから離れたときに消えてしまうことです。サービス自体がまだ実行中であることを確認してください。

お使いのアプリの[通知を表示]設定がオフになっていないことを確認してください。

+0

Tedに感謝しますが、それは問題ではありません。私は、ブロードキャスト受信者と別のケースではハンドラを使用して遠ざかることのないバックグラウンドサービスからのトーストメッセージを表示しています。私はそれが正常に外部デバイスとデータを交換するため、サービスがなくなっていないことを知っています。しかし、私は主な活動中にこれらのトーストメッセージを見るだけです。たとえば、いくつかのパラメータを設定したり、デバッグ出力を見たりするなど、私のメインアクティビティから別のアクティビティに移動する必要がある場合、これらのToastメッセージは送信されていますが、表示されません。 –

0

Reazのおかげで、私が作ったばかげたエラーが見つかりました。私はonDestroy()の代わりにonStop()でトーストを扱うBroadcastReceiverの登録を解除していました。登録解除をonDestroy()に移し、登録とフィルタをonCreate()に移して問題を解決しました。

関連する問題