2012-06-09 66 views
4

我有一個ToastService內部調用。 無論設計的應用程序狀態如何,它始終顯示。只有當應用程序在前臺時,Toast纔會出現?

如何才能使它只出現在我的應用程序在前臺,而不是其他應用程序在前面?也就是說,沒有將它移動到Activity的代碼。

回答

9

mparaz,

有很多方法可以很容易地做你想做的事情。在我這樣做之前,我想解決你的問題中一個非常重要的缺陷。應用程序不是活動,活動不是應用程序。因此,應用程序不能位於前景或背景中。這隻保留給活動。

一個簡單的例子,然後給你回答。您的服務是您的應用程序的一部分。雖然「活動」不是,但應用程序已加載。如果您的應用程序未加載,您的服務無法運行。我只強調這一點,因爲它是Android中的一個重要理念,並且理解這些術語的正確使用以及定義這些術語的概念將使您在將來更加輕鬆。

一個簡單的解決

您可以擴展應用程序對象,並在班級舉行一個簡單的公共標誌。然後,當活動進入後臺時,可以將標誌設置爲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; 
} 

在您的服務(如調用吐司)

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

這是真的很簡單。哦,是的...不要忘記告訴清單你正在擴大申請。對於在AndroidManifest.xml您的應用程序聲明

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

希望這有助於

FuzzicalLogic

+0

謝謝!對於你的初步澄清 - 通過「應用程序」,我的意思是通俗的說法,而不是「android.app.Application」,所以這將是「任何'Activity'」。 – mparaz

1

我不是很好,但我認爲如果你把你的Toast放在onResume()中,它只會在你的應用上運行。

+0

謝謝回答。是的,這是正確的,因爲只有當我的應用程序處於前臺時,纔會調用onResume()。不過,我希望在我的「服務」中保留Toast調用。 – mparaz

2

只要將一些標誌

public class MyActivity { 

    private boolean isInForeground; 

    protected onResume() { 
     isInForeground = true; 
    } 

    protected onPause() { 
     isInForeground = false; 
    } 

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

} 
相關問題