如何只在一个 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
}