如何只在一个活动中显示Toast消息?

时间:2016-06-29 16:32:35

标签: java android android-activity android-toast

在我正在开发的应用程序中,我有一些代码试图将信息提交到互联网。如果无法建立连接,我会弹出一条Toast消息,指示用户检查网络连接。

  Toast.makeText(getApplicationContext(), "Check network connection.", Toast.LENGTH_SHORT).show();

我遇到的问题是无论用户在看什么,都会出现toast消息!即使用户在不同的应用程序中,我的应用程序在后台运行!如果网络活动失败,我会向用户发送通知,这不是理想的行为。我只希望在用户处于生成网络活动的活动中时显示Toast消息。有没有办法做到这一点?

如果这不可能,我的想法是在我的活动中加入某种视觉元素 - 而不是显示祝酒信息。

谢谢!

3 个答案:

答案 0 :(得分:1)

您可以使用布尔类成员来跟踪活动状态更改。

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
}

答案 1 :(得分:0)

保持简单,尝试在Activity中添加一个布尔标志,并在onResume中将其值设置为 true &在onPause中 false 。如果布尔标志为 true ,则显示toast。

答案 2 :(得分:0)

使用动态BroadcastReceiver。当事情发生时,您的后台服务将广播Intent。您的所有应用活动都会注册一个动态BroadcastReceiver,它会监听这些活动。当这样的事件发生时,它将显示祝酒。当你的活动都没有运行时,什么都不会发生。

在您的服务中

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) {}
}

您可能希望将此代码提取到公共活动父级BaseActivity,因此您不必重复此操作。

这是Provider-Subscriber模式的常见情况。另一个实现是EventBus