7

我有一个Toast从内部调用的 a Service。无论应用程序的状态如何,它总是按设计出现。

如何让它只在我的应用程序在前台时出现,而不是在其他应用程序在前面时出现?也就是说,无需将其移至Activity代码。

4

3 回答 3

14

姆帕拉兹,

有很多方法可以很容易地做你想做的事。在我这样做之前,我想解决你问题中的一个非常重要的缺陷。App 不是 Activity,Activity 也不是 App。因此,应用程序不能位于前台或后台。这仅保留给活动。

一个简单的例子,然后给你回答。您的服务是您的应用程序的一部分。尽管 Activity 没有加载,但应用程序已加载。如果您的应用程序未加载,您的服务将无法运行。我之所以强调这一点,是因为它是 Android 中的一个重要理念,理解这些术语的正确使用以及定义它们的概念将使您在未来变得更加容易。

一个简单的解决方案

您可以扩展 Application 对象并在类中保存一个简单的公共标志。然后,您可以在活动进入后台时将标志设置为 false,在前台设置为 true(当然反之亦然)。

扩展应用程序:

public class MyApplication extends Application
{
    static public boolean uiInForeground = false;
}

设置标志:在您的活动中...

//This may be done in onStart(), onResume(), onCreate()... 
//... whereever you decide it is important. 
//Note: The functions here do not include parameters (that's Eclipse's job).
public void onStart()
{//Notice the static call (no instance needed)
    MyApplication.uiInForeground = true;
}

public void onPause()
{
    MyApplication.uiInForeground = false;
}

在你的服务中(你叫 Toast 的地方)

    if (MyApplication.uiInForeground)
        Toast.makeText(someContext, myMsg).show();

真的就这么简单。哦,是的...不要忘记告诉清单您正在扩展应用程序。对于您在 AndroidManifest.xml 中的应用程序声明

<application android:name=".MyApplication" .... >
   <!-- All other components -->
</application>

希望这可以帮助,

模糊逻辑

于 2012-06-09T11:18:22.137 回答
2

只需放置一些标志

public class MyActivity {

    private boolean isInForeground;

    protected onResume() {
        isInForeground = true;
    }

    protected onPause() {
        isInForeground = false;
    }

    private displayToast() {
        if(isInForeground) {
           Toast.makeToast().show();
        }
    }

}
于 2012-09-29T15:23:22.387 回答
1

我不太擅长,但我认为如果您将 Toast 放在 onResume() 中,它只会在您的应用程序上运行。

于 2012-06-09T10:32:14.957 回答