web-dev-qa-db-ja.com

アクティビティが最前面にあり、ユーザーに表示されているかどうかを検出するにはどうすればよいですか?

私のアクティビティのいずれかが表示されているときにインテントを起動したいのですが、それ以外の場合は通知として表示し、ユーザーによって起動されます。

これを決定するには、自分のアクティビティが最前面にあるかどうかを知る必要があります。どうすればよいですか?

25
Pentium10

現在表示されているアクティビティを取得する方法があることはわかりませんが、 アクティビティライフサイクル とフラグを組み合わせて何かを行うことができます。

フラグについては、Applicationクラスを拡張した場合、おそらくそれを格納するための適切な場所です。アプリケーションクラスを拡張する場合、 この質問に対するトップの回答 に情報があります。 (d)。

したがって、おそらく、希望する動作に応じて、onResume/onPauseまたはonStart/onStopで現在アクティブなアクティビティ(またはアクティビティが表示されていることを示すフラグ)を追跡します。

複数のアクティビティがあるため、フラグを格納するための重心の場所が必要になります。これが、アプリケーションが理にかなっている理由です。アプリケーションコンテキストをキャストすることで、カスタムアプリケーションオブジェクトを取得できます(例((MyApplication)getApplicationContext())。isMyActivityActive)。

また、Activityを拡張して、このコードをクリーンで閉じ込められた状態に保つことができます。


サービスを使用している場合は、onStart/onStop(またはonResume/onPause)のすべてのアクティビティでサービスにバインドできます。バインドされている場合は、表示されます。

10
mbafford

ActivityManagerから実行中のタスクを要求できます。

ActivityManager activityManager = (ActivityManager)getContext()
                .getSystemService(Context.ACTIVITY_SERVICE);
List<RunningTaskInfo> runningTasks = activityManager.getRunningTasks(Integer.MAX_VALUE));

APIドキュメントから:

現在実行中のタスクのリストを返します。最新のものから順に、古いものから順に返します。

したがって、リストの最初の項目は最前面のアクティビティです。

4
Zds

OnWindowFocusChanged(boolean hasFocus)を使用してこれをアクティビティのスーパークラスに配置し、フォーカスがある場合にインテントを起動できます。

2
Grant

onResume()が呼び出されました&& onPause()が呼び出されていません=表示されています。
Applicationサブクラスに_public static Activity currentlyVisible;_を入れ、アクティビティによって更新します(onResume()のインスタンスとonPause()nulledに設定)。または、それほど醜くないレジストリのバリアントを発明します。

2
yanchenko

アクティビティマネージャーを使用する代わりに、コードを通じて実行できる簡単なトリックがあります。アクティビティサイクルを注意深く観察すると、2つのアクティビティと前景から背景へのフローは次のようになります。 AとBが2つのアクティビティであるとします。

AからBへの遷移時:1. AのonPause()が呼び出されます2. BのonResume()が呼び出されます3. Bが完全に再開されたときにAのonStop()が呼び出されます

アプリがバックグラウンドになるとき:1. AのonPause()が呼び出されます2. AのonStop()が呼び出されます

フラグを設定するだけで、バックグラウンドイベントを検出できます。

抽象アクティビティを作成し、それを他のアクティビティから拡張して、バックグラウンドイベントが必要な場所に他のすべてのアクティビティのコードをコピーして貼り付ける必要がないようにします。

抽象アクティビティでは、フラグisAppInBackgroundを作成します。

OnCreate()メソッド内:isAppInBackground = false;

OnPause()メソッド内:isAppInBackground = false;

OnStop()メソッド内:isAppInBackground = true;

IsAppInBackgroundがtrueの場合は、onResume()をチェックインする必要があります。 nフラグを確認した後、isAppInBackground = falseを再度設定します

2つのアクティビティ間の遷移の場合、最初のonSTop()は常に2番目のアクティビティが再開した後に呼び出されるため、フラグは決してtrueにならず、アプリがバックグラウンドにある場合、アクティビティのonStop()はonPauseの直後に呼び出されるため、フラグはtrueになります。後でアプリを開きます。

0
Ankita