7

Toastの内側から呼び出されるがありますService。設計どおり、アプリの状態に関係なく常に表示されます。

他のアプリが前面にあるときではなく、自分のアプリが前面にあるときにのみ表示されるようにするにはどうすればよいですか?つまり、Activityコードに移動せずに。

4

3 に答える 3

14

mparaz、

やりたいことをとても簡単に行う方法はたくさんあります。その前に、あなたの質問の非常に重要な欠陥に対処したいと思います。アプリはアクティビティではなく、アクティビティはアプリではありません。そのため、アプリをフォアグラウンドまたはバックグラウンドにすることはできません。これはアクティビティ専用です。

簡単な例そしてあなたに答えます。あなたのサービスはあなたのアプリケーションの一部です。アクティビティはロードされていませんが、アプリケーションはロードされています。アプリケーションがロードされていない場合、サービスを実行できませんでした。これは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;
}

あなたのサービス(あなたがトーストと呼ぶところ)で

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

それは本当にそれと同じくらい簡単です。そうそう...アプリケーションを拡張していることをマニフェストに伝えることを忘れないでください。AndroidManifest.xmlでのアプリケーション宣言用

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

お役に立てれば、

FuzzicalLogic

于 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 に答える