59

AlarmManager によってトリガーされる BroadcastReceiver を実装しました。AlarmManager は BOOT_COMPLETED で初期化されます。したがって、マニフェストでレシーバーを宣言する必要があります。

私の問題は、自分のアクティビティがフォアグラウンドにない場合 (つまり、ユーザーがアプリケーションと対話していない場合) にのみ、BroadcastReceiver に何かをさせたいということです。私はリモートサーバーから情報を引き出しますが、ユーザーが現在私のアプリケーションにいる場合、ユーザーに通知したくありません。

これまでのところ、アプリケーションがフォアグラウンドにあるかどうかを判断する方法を見つけることができませんでした。そのようなことをする方法はありますか?ActivityManager は、アプリケーションが実行されているかどうかはわかりますが、フォアグラウンドにあるかどうかはわかりません。

問題は、ここで説明されているものとほとんど同じです:フォアグラウンドにある場合にのみ、BroadcastReceiver からのアクティビティに通知する

解決:

いくつかのソリューションを評価した後、バックグラウンド/フォアグラウンドでのアクティビティに対処するための最良の方法と思われるものを簡単に概説したいと思います。

推奨される方法は、ブロードキャスト レシーバーをアクティビティの onResume メソッドに登録し、onPause のアクティビティで登録解除することです。サービスまたはその他のバックグラウンド要素は、アクティビティがインターセプトする特定のアクションを含むブロードキャスト インテントを送信する必要があります。

アクティビティがフォアグラウンドにある場合、インテント レシーバーが登録され、サービスから送信されたインテントを直接処理できます。フォアグラウンドにない場合、インテントを受信しませんが、ブロードキャストを呼び出したサービスは、そのブロードキャスト インテントを誰も傍受していないことを認識し、それ自体を処理できます。たとえば、目的のアクティビティを起動したり、通知を表示したりできます。

4

7 に答える 7

27

次の回答: 「アプリケーションはバックグラウンドで実行されていますか」は、バックグラウンド/フォアグラウンド チェックに使用できるソリューションをまとめたものです。

注:
以前、この回答は を使用することを提案してActivityManager.getRunningAppProcesses()いましたが、その方法は完全には信頼できないようであり、その使用は推奨されていません。詳細は上記リンクをご確認ください。

于 2011-03-07T15:14:05.297 に答える
12

アクティビティは、フォアグラウンドにあるかどうかに関する独自の状態を追跡できます (ブール値をtrueinonStart()に設定し、 in に設定falseonStop()ます)。残念ながら、そのブール値はActivity自動的には提供されません。

于 2010-02-23T00:09:29.860 に答える
4

ActivityManager#getRunningAppProcesses()のリストを返しますRunningAppProcessInfo。それぞれRunningAppProcessInfoに重要性と呼ばれるフィールドがあります。等しい重要度RunningAppProcessInfo.IMPORTANCE_FOREGROUNDは、どのアクティビティがユーザーによってアクティブに観察されているかを示しているようです。より低いものもRunningAppProcessInfo.IMPORTANCE_VISIBLEありますが、チェックする価値があるかもしれません。

于 2010-02-23T01:45:45.907 に答える
3

アクティビティがフォアグラウンドにあるかどうかを判断するための私のソリューションを確認してください:http://www.mannaz.at/codebase/android-activity-foreground-surveillance/

ロジックを「フォアグラウンド」から「フォアグラウンドではない」に簡単に戻すことができます。

于 2011-01-26T20:25:48.970 に答える
3

AlarmManager によってトリガーされる BroadcastReceiver を実装しました。AlarmManager は BOOT_COMPLETED で初期化されます。したがって、マニフェストでレシーバーを宣言する必要があります。

私の問題は、自分のアクティビティがフォアグラウンドにない場合 (つまり、ユーザーがアプリケーションと対話していない場合) にのみ、BroadcastReceiver に何かをさせたいということです。私はリモートサーバーから情報を引き出しますが、ユーザーが現在私のアプリケーションにいる場合、ユーザーに通知したくありません。

これまでのところ、アプリケーションがフォアグラウンドにあるかどうかを判断する方法を見つけることができませんでした。そのようなことをする方法はありますか?ActivityManager は、アプリケーションが実行されているかどうかはわかりますが、フォアグラウンドにあるかどうかはわかりません。

アクティビティの 1 つが現在実行中のフォアグラウンド アクティビティであるかどうかを判断する直接的な方法はないようです。ただし、順序付けられたブロードキャストと 2 つのブロードキャスト レシーバーを使用することで、目的の効果を得ることができます。1 つのブロードキャスト レシーバーを OnResume() で登録し、OnPause() で登録解除する必要があります。2 番目のブロードキャスト レシーバーは、既に行ったようにマニフェストで宣言されます。レシーバーの android:priority を設定して、動的に登録されたレシーバーが登録されている場合に最初にインテントを受信し、次にインテントを食べて、マニフェストに登録したブロードキャスト レシーバーに通知されないようにします。

于 2011-08-14T20:56:17.870 に答える
1

ウィンドウにフォーカスがあるかどうかをテストできますが、開発ドキュメントに記載されているように、これはアクティビティがフォアグラウンドにある場合と同じではありません。

于 2011-02-14T15:55:36.947 に答える
1

ActivityLifecycleCallbacksを使用して、よりクリーンなソリューションを取得します。

安全ではない可能があります。以下の例を本番環境で使用することを決定する前に、これをお読みください。私のデバイスとOSバージョンの「ホーム開発」で動作します。

public class App extends Application implements Application.ActivityLifecycleCallbacks {

private boolean inForeground;

@Override
public void onCreate() {
    super.onCreate();
    registerActivityLifecycleCallbacks(this);
}

@Override
public void onActivityResumed(Activity activity) {
    inForeground = activity instanceof YourActivity;
}

public boolean isInForeground() {
    return inForeground;
}

Appで登録AndroidManifest:

<application
        android:name=".App" />

パズルの最後のピース:

public class YourReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        App app = (App) context.getApplicationContext();
        if(app.isInForeground()){
            // do some stuff
        }
    }
}
于 2014-12-05T16:28:27.403 に答える