3

アプリケーションがフォアグラウンドにあるかどうかを検出する理由はたくさんあります。たとえば、GCM/C2DM プッシュ通知のトリガーとして、多くのアプリには、アプリがフォアグラウンドとバックグラウンドの場合に異なる動作を実装する正当な理由があります。他の理由としては、たとえばバックグラウンド タスクでサーバーにクエリを実行するなど、貴重なリソースを消費するサービスを停止することが考えられます。

明確にするために、バックグラウンドアプリの定義(私が見ているように)は次のとおり
です。そのアクティビティのどれもonStart()メソッドを呼び出しておらず、まだonStop()メソッドを呼び出していないアプリケーションです。これは、その時点でのみアクティビティがそのライフ サイクルでユーザーに表示されるためです。

一方、

  • Google は、アプリケーションがホーム ボタンに反応することを望まないようです (これは API の一部ではありません)。

  • onBackPressed()「ルート/メイン」アクティビティに反応することは、Activity確かに良い考えではありません(多くのユーザーが戻るボタンではなくホームボタンを使用しているため)

  • APIには、アプリがフォアグラウンドかどうかを判断できるメソッドはありません(私の定義によると..)

API で何かを見逃していなければ、実際にそうです -アプリケーションがフォアグラウンドかどうかを簡単に判断する理由がないのはなぜですか????!!!!

アプリケーションがフォアグラウンドかどうかを判断するために私ができることは、このスレッドで説明されています - Android アプリがバックグラウンドに移行してフォアグラウンドに戻るタイミングを検出する方法

しかし、@Emilが言っているように-特別な許可が必要であるか、維持するのに非常に急速に問題になるトリッキーなロジックが必要であり、悪いアプローチのように思えます(ただし、それは私が今のところ行っていることですが、より良いアイデアがないため. ..)

私の質問は基本的に次のとおりです。

  • 正当な理由からそのような API メソッドはありませんか?

  • アプリケーションがフォアグラウンドかどうかを考慮するのは悪いアプローチですか?

  • アプリケーションがフォアグラウンドかどうかを知る他の方法はありますか?

4

4 に答える 4

5

アプリケーションがフォアグラウンドかどうかを考慮するのは悪いアプローチですか?

前景と背景を考慮することは合理的です。

アプリケーションがフォアグラウンドかどうかを知る他の方法はありますか?

このシナリオは、大まかに次の 2 つのグループに分けることができます。

  1. フォアグラウンド/バックグラウンドの状態が変化したときにすぐにアクションを起こしたい場合

  2. 他のイベント (AlarmManagerアラーム、着信システム ブロードキャストなど) が発生し、その時点でフォアグラウンドにいるかどうかに基づいて異なるアクションを実行したい場合。

前者の場合、onUserLeaveHint()最も信頼できる単純なオプションです。すべてのケースをカバーすることは保証できませんが、たとえば、HOME シナリオを処理する必要があります。静的データ メンバーで開始されたアクティビティの参照カウントを維持し、代わりにそれを使用することもできます。

後者の場合、順序付きブロードキャストが役立ちます。

于 2012-12-26T18:34:06.093 に答える
0

アプリがバックグラウンドで実行されているサービスからバックグラウンドにあるかフォアグラウンドにあるかを知る必要がある場合 (それ以外の場合は意味がありません)、バインディングを使用できます。つまり、すべてのアクティビティ onResume にバインドします。 、すべてのアクティビティ onPause のバインドを解除します。次に、サービスで、ユーザーに対するアプリケーションの可視性だけでなく、いつでも開いているアクティビティも管理できます。また、AndroidのAPIを使用し、Android OSコード自体の正確さに依存しているため、静的変数(必要に応じてクリーンアップできます)よりも漏れがなく、より安定しています。

于 2014-04-28T17:08:59.087 に答える
0

同じ問題がありました。アクティビティがフォアグラウンド モードでないときにプッシュ通知を表示したい。次のコードを実行すると、答えが得られます。

    Context ctx = context.getApplicationContext();

    ActivityManager am = (ActivityManager) context
            .getSystemService(ACTIVITY_SERVICE);

    // get the info from the currently running task
    List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1);

    PackageManager pm = this.getPackageManager();

    try {
        /**
         * take fore ground activity name
         */
        ComponentName componentInfo = taskInfo.get(0).topActivity;
        if (printLog == true) {
            Log.d("Home", "CURRENT Activity ::"
                    + taskInfo.get(0).topActivity.getClassName());
            Log.d("Home", "Number Of Activities : "
                    + taskInfo.get(0).numRunning);
            Log.d("Home",
                    "Componenet Info : " + componentInfo.getPackageName());
            Log.d("Home",
                    "Componenet Info : " + componentInfo.getClassName());
        }
        /**
         * All activities name of a package to compare with fore ground
         * activity. if match found, no notification displayed.
         */
        PackageInfo info = pm.getPackageInfo(
                "<PackageName>",
                PackageManager.GET_ACTIVITIES);
        ActivityInfo[] list = info.activities;

        for (int i = 0; i < list.length; i++) {
              Log.d("TAG","Activity : "+list[i].name);
        }

    } catch (NameNotFoundException e) {
        e.printStackTrace();
    }

これを使用するには、manifestファイルで許可を得る必要があります。

uses-permission android:name="android.permission.GET_TASKS"

質問が聞き取れない場合はご容赦ください。

于 2012-12-26T18:34:22.383 に答える