Как можно сделать тосты, только если приложение находится на переднем плане?

У меня есть Toast, который вызывается изнутри a Service. Он всегда отображается независимо от состояния приложения, как это предусмотрено.

Как это можно сделать, только когда мое приложение находится на переднем плане, а не когда другие приложения находятся впереди? То есть, не перемещая его в код Activity.

Ответ 1

mparaz,

Существует несколько способов сделать то, что вы хотите очень легко. Прежде чем я это сделаю, я хотел бы затронуть очень важный недостаток в вашем вопросе. Приложение не является Activity, а Activity не является приложением. Таким образом, приложение не может быть на переднем плане или на заднем плане. Это зарезервировано только для Деяний.

Быстрый пример, а затем ответьте. Ваша Служба является частью вашего Приложения. Приложение загружается, хотя Activity is not. Если ваше приложение не было загружено, ваша служба не могла работать. Я только подчеркиваю это, потому что это важная философия в Android и понимание правильного использования этих терминов, и концепции, которые их определяют, сделают это намного проще для вас в будущем.

Простое решение

Вы можете расширить объект приложения и провести простой публичный флаг в классе. Затем вы можете установить флаг в значение false в любое время, когда действие переходит к фону и истинно, когда дело доходит до переднего плана (или наоборот, конечно).

Расширение приложения:

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 Eclipse 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>

Надеюсь, что это поможет,

FuzzicalLogic

Ответ 2

Просто поместите флаг

public class MyActivity {

    private boolean isInForeground;

    protected onResume() {
        isInForeground = true;
    }

    protected onPause() {
        isInForeground = false;
    }

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

}

Ответ 3

Я не так хорош в этом, но я думаю, что если вы поместите свой Toast в onResume(), он будет запускаться только в вашем приложении.