我的做法类似于此处讨论的内容: Android BroadcastReceiver within Activity
我有使用或不使用UI运行的应用程序。当屏幕关闭时,它只是在背景上工作。当UI打开并且可见时 - 我想让用户知道发生了什么。
所以,我在上面的主题中跟踪了样本,并在Activity
上注册了广播接收器。我在onResume
onPause
并取消注册
private BroadcastReceiver uiNeedToBeUpdatedReceiver = new BroadcastReceiver()
{
@Override
public void onReceive(Context context, Intent intent)
{
// TODO Auto-generated method stub
Toast.makeText(BaseActivity.this, "received", Toast.LENGTH_LONG);
}
};
@Override
protected void onPause()
{
Log.d(LOG_TAG, "onPause");
super.onPause();
// TODO: Unregister broadcast receiver
unregisterReceiver(uiNeedToBeUpdatedReceiver);
}
@Override
protected void onResume()
{
Log.d(LOG_TAG, "onResume");
super.onResume();
// TODO: Register for broadcast events
IntentFilter filter = new IntentFilter();
filter.addAction("com.my.uineedtobeupdated");
registerReceiver(uiNeedToBeUpdatedReceiver, filter);
在我在后台运行的AsyncTask
内执行此操作:
// Send broadcast - if UI active it will see it:
Intent broadcast = new Intent();
broadcast.setAction("com.my.uineedtobeupdated");
MyApplication.Me.sendBroadcast(broadcast);
嗯,一切都有效。我收到广播,我在调试器中看到我正在尝试Toast应该显示的行。但我没有看到任何吐司出现。
这是线程问题吗?我虽然如果收到广播,它会在UI线程上?为什么我会观察到这种行为?
答案 0 :(得分:11)
重要的是不仅要创建Toast,还要实际显示它。简单的方法:
Toast.makeText(BaseActivity.this, "received", Toast.LENGTH_LONG).show();
你当然也可以:
Toast myToast = Toast.makeText(BaseActivity.this, "received", Toast.LENGTH_LONG);
myToast.show();
答案 1 :(得分:2)
Toast.makeText(BaseActivity.this, "received", Toast.LENGTH_LONG);
您正在制作Toast
,但您没有展示它。您需要在其上调用show
,如下所示:
Toast.makeText(BaseActivity.this, "received", Toast.LENGTH_LONG).show();