如何只在一个 activity 中显示一条 toast 消息?
How to display a toast message in only one activity?
在我正在开发的应用程序中,我有一些代码试图将信息提交到 Internet。如果连接不上,我弹出toast消息提示用户检查网络连接。
Toast.makeText(getApplicationContext(), "Check network connection.", Toast.LENGTH_SHORT).show();
我遇到的问题是,无论用户在看什么,都会出现 toast 消息!即使用户在不同的应用程序中,而我的应用程序在后台 运行!这不是我想要的行为,因为如果网络 activity 出现故障,我会向用户发送通知。如果用户在生成网络 activity 的 activity 中,我只希望出现 toast 消息。有没有办法做到这一点?
如果这不可能,我的想法是在我的 activity 中放置某种视觉元素,而不是显示吐司消息。
谢谢!
为简单起见,尝试在 Activity 中添加一个布尔标志,并在 onResume 中将其值设置为 true 并在 onPause[=15 中将其值设置为 false =].如果布尔标志为 true.
,则显示 toast
使用动态 BroadcastReceiver
。当发生某些事情时,您的后台服务将广播 Intent
。您应用的所有活动都将注册一个动态 BroadcastReceiver
来监听这些事件。当这样的事件发生时,它会显示祝酒词。当您的 none 活动是 运行 时,什么都不会发生。
在您的服务中
public static final ACTION_SOMETHING = BuildConfig.APPLICATION_ID + ".ACTION_SOMETHING";
public void doSomething() {
// ...
// Show toast if app is running. Or let the app react however you please.
LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent(ACTION_SOMETHING));
// ...
}
当然,您可以在 Intent
中添加额外信息,然后在 BroadcastReceiver
中访问它们。
在你的活动中
private final IntentFilter onSomethingIntentFilter = new IntentFilter(MyService.ACTION_SOMETHING);
private final BroadcastReceiver onSomething = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// This check seems redundant but it's not. Google it.
if (MyService.ACTION_SOMETHING.equals(intent.getAction()) {
// Show toast here.
}
}
};
public void onResume() {
super.onResume();
// Start listening for events when activity is in foreground.
LocalBroadcastManager.getInstance(this).registerReceiver(onSomething, onSomethingIntentFilter);
}
public void onPause() {
super.onPause();
// Stop listening as soon as activity leaves foreground.
try {
LocalBroadcastManager.getInstance(this).unregisterReceiver(onSomething);
} catch (IllegalArgumentException ex) {}
}
您可能希望将此代码拉到一个共同的 activity 父级,一个 BaseActivity
,这样您就不会重复自己。
这是提供者-订阅者模式的常见情况。另一种实现方式是 EventBus.
您可以使用布尔值 class 成员来跟踪 activity 状态变化。
public class YourClass extends Activity {
private boolean mIsResumed = false;
@Override
public void onResume() {
super.onResume();
mIsResumed = true;
}
@Override
public void onPause() {
super.onPause();
mIsResumed = false;
}
public boolean isResumed() {
return mIsResumed;
}
}
然后你可以使用这样的东西:
if (isResumed()) {
//show Toast
}
在我正在开发的应用程序中,我有一些代码试图将信息提交到 Internet。如果连接不上,我弹出toast消息提示用户检查网络连接。
Toast.makeText(getApplicationContext(), "Check network connection.", Toast.LENGTH_SHORT).show();
我遇到的问题是,无论用户在看什么,都会出现 toast 消息!即使用户在不同的应用程序中,而我的应用程序在后台 运行!这不是我想要的行为,因为如果网络 activity 出现故障,我会向用户发送通知。如果用户在生成网络 activity 的 activity 中,我只希望出现 toast 消息。有没有办法做到这一点?
如果这不可能,我的想法是在我的 activity 中放置某种视觉元素,而不是显示吐司消息。
谢谢!
为简单起见,尝试在 Activity 中添加一个布尔标志,并在 onResume 中将其值设置为 true 并在 onPause[=15 中将其值设置为 false =].如果布尔标志为 true.
,则显示 toast使用动态 BroadcastReceiver
。当发生某些事情时,您的后台服务将广播 Intent
。您应用的所有活动都将注册一个动态 BroadcastReceiver
来监听这些事件。当这样的事件发生时,它会显示祝酒词。当您的 none 活动是 运行 时,什么都不会发生。
在您的服务中
public static final ACTION_SOMETHING = BuildConfig.APPLICATION_ID + ".ACTION_SOMETHING";
public void doSomething() {
// ...
// Show toast if app is running. Or let the app react however you please.
LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent(ACTION_SOMETHING));
// ...
}
当然,您可以在 Intent
中添加额外信息,然后在 BroadcastReceiver
中访问它们。
在你的活动中
private final IntentFilter onSomethingIntentFilter = new IntentFilter(MyService.ACTION_SOMETHING);
private final BroadcastReceiver onSomething = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// This check seems redundant but it's not. Google it.
if (MyService.ACTION_SOMETHING.equals(intent.getAction()) {
// Show toast here.
}
}
};
public void onResume() {
super.onResume();
// Start listening for events when activity is in foreground.
LocalBroadcastManager.getInstance(this).registerReceiver(onSomething, onSomethingIntentFilter);
}
public void onPause() {
super.onPause();
// Stop listening as soon as activity leaves foreground.
try {
LocalBroadcastManager.getInstance(this).unregisterReceiver(onSomething);
} catch (IllegalArgumentException ex) {}
}
您可能希望将此代码拉到一个共同的 activity 父级,一个 BaseActivity
,这样您就不会重复自己。
这是提供者-订阅者模式的常见情况。另一种实现方式是 EventBus.
您可以使用布尔值 class 成员来跟踪 activity 状态变化。
public class YourClass extends Activity {
private boolean mIsResumed = false;
@Override
public void onResume() {
super.onResume();
mIsResumed = true;
}
@Override
public void onPause() {
super.onPause();
mIsResumed = false;
}
public boolean isResumed() {
return mIsResumed;
}
}
然后你可以使用这样的东西:
if (isResumed()) {
//show Toast
}