1. ホーム
  2. android

[解決済み] アクティビティがフォアグラウンドにあるか、目に見えるバックグラウンドにあるかを確認する方法は?

2022-09-17 17:19:53

質問

タイマーでスプラッシュスクリーンを表示させています。私の問題は、私が前に finish() を実行する前に、次のアクティビティが開始されたことを確認する必要があることです。 finish() ユーザがダイアログボックスからオプションを選択すると、次のアクティビティが開始されます。

アクティビティがフォアグラウンドにあるかどうかを確認する方法について多くの質問があることは知っていますが、これによってアクティビティの上にもダイアログボックスができるのかどうかはわかりません。

赤は私の活動で、バックグラウンドにあり、ダイアログはフォアグラウンドにあります。

EDITです。 を使わないようにしてみました。 finish() を使わないようにしてみましたが、そうすると、私の活動は、私が避けようとしているアプリケーションのスタックに戻ることができます。

どのように解決するのですか?

として推奨されているものです。 の解決策として推奨されているものです。

正しい解決策 (クレジット:Dan、CommonsWare、NeTeInStEiN) アプリケーションの可視性を自分で追跡するには Activity.onPause, Activity.onResume メソッドを使用します。visibility"ステータスを他のクラスに保存する。 を他のクラスに保存します。を実装したクラスがよいでしょう。 アプリケーションまたはサービス(このソリューションにはいくつかのバリエーションがあります。 サービスからアクティビティの可視性をチェックしたい場合は、このソリューションのいくつかのバリエーションもあります)。

独自のApplicationクラスを実装します(isActivityVisible()静的メソッドに注意)。

public class MyApplication extends Application {

  public static boolean isActivityVisible() {
    return activityVisible;
  }  

  public static void activityResumed() {
    activityVisible = true;
  }

  public static void activityPaused() {
    activityVisible = false;
  }

  private static boolean activityVisible;
}

<ブロッククオート

AndroidManifest.xmlにアプリケーションクラスを登録します。

<application
    android:name="your.app.package.MyApplication"
    android:icon="@drawable/icon"
    android:label="@string/app_name" >

<ブロッククオート

プロジェクト内のすべてのActivityにonPauseとonResumeを追加します(必要であれば、Activityの共通の祖先を作成しても構いません。 アクティビティに共通の祖先を作ることもできますが アクティビティがMapActivity/ListActivityなどから既に拡張されている場合は、以下のように記述する必要があります。 を手で書く必要があります)。

@Override
protected void onResume() {
  super.onResume();
  MyApplication.activityResumed();
}

@Override
protected void onPause() {
  super.onPause();
  MyApplication.activityPaused();
}

あなたの finish() メソッドでは isActivityVisible() を使用して、アクティビティが表示されているかどうかをチェックします。 そこでは、ユーザーがオプションを選択したかどうかもチェックすることができます。 両方の条件が満たされたときに続行します。

ソースは2つの間違った解決策にも言及しています...ので、それを行うことは避けてください。

ソースはこちら スタックオーバーフロー