Androidアプリケーションがバックグラウンドで実行されているかどうかを確認する 質問する

Androidアプリケーションがバックグラウンドで実行されているかどうかを確認する 質問する

バックグラウンドとは、アプリケーションのアクティビティが現在ユーザーに表示されないことを意味しますか?

ベストアンサー1

アプリケーションがバックグラウンドで実行されているかどうかを検出する方法はいくつかありますが、完全に信頼できるのはそのうちの 1 つだけです。

  1. 正しい解決策(クレジットはダンコモンズウェアそしてネテインシュタイン)メソッドを使用して、
    アプリケーションの可視性を自分で追跡します。他のクラスに「可視性」ステータスを保存します。独自の または の実装が適しています(Activity.onPauseActivity.onResumeApplicationServiceいくつかのバリエーションサービスからアクティビティの可視性をチェックしたい場合は、このソリューションを参照してください。
     
    例:
    カスタム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" >
    

    プロジェクト内のすべてのonPauseとを追加します(必要に応じてアクティビティの共通の祖先を作成することもできますが、アクティビティがすでに/などから拡張されている場合は、次のコードを手動で記述する必要があります)。onResumeActivityMapActivityListActivity

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

     
    アップデート
    アクティビティライフサイクルコールバックAPIレベル14(Android 4.0)で追加されました。これらを使用して、アプリケーションのアクティビティが現在ユーザーに表示されているかどうかを追跡できます。コーンストークスの答え詳細は下記をご覧ください。

  2. 間違った方法として、
    私は次のような解決策を提案しました。

    現在フォアグラウンド/バックグラウンドのアプリケーションを検出するには、ActivityManager.getRunningAppProcesses()レコードのリストを返しますRunningAppProcessInfo。アプリケーションがフォアグラウンドにあるかRunningAppProcessInfo.importanceどうかを判断するには、RunningAppProcessInfo.IMPORTANCE_FOREGROUNDフィールドRunningAppProcessInfo.processNameがアプリケーション パッケージ名と等しいかどうかを確認します。

    また、アプリケーションの UI スレッドから呼び出すと、実際にフォアグラウンドにあるかどうかに関係なく、タスクのActivityManager.getRunningAppProcesses()重要度が返されますIMPORTANCE_FOREGROUND。バックグラウンド スレッドで呼び出すと (たとえば、 経由AsyncTask)、正しい結果が返されます。

    この解決策は機能するかもしれませんが (実際ほとんどの場合は機能します)、使用を控えることを強くお勧めします。その理由は次のとおりです。ダイアン・ハックボーンが書いたように:

    これらの API は、アプリケーションの UI フローのベースとなるものではなく、実行中のアプリやタスク マネージャーなどをユーザーに表示するために使用されます。

    はい、これらのことに関するリストはメモリ内に保持されています。ただし、これは別のプロセスにあり、自分のプロセスとは別に実行されているスレッドによって管理されており、(a) 適切な判断を下すために間に合うように確認したり、(b) 戻るまでに一貫した画像を取得したりできるものではありません。さらに、「次の」アクティビティが何であるかの決定は、常に切り替えが行われる時点で行われ、その正確な時点 (切り替えを行うためにアクティビティの状態が一時的にロックダウンされる時点) になって初めて、次に何が行われるかが実際に確実にわかるのです。

    また、ここでの実装とグローバルな動作は、将来も同じままであるとは保証されません。

    SO に回答を投稿する前にこれを読んでいればよかったのですが、間違いを認めるのに遅すぎないことを願っています。

  3. もう一つの間違った解決策
    ドロイドフー回答の 1 つに記載されているライブラリでは、そのメソッドが使用されていますActivityManager.getRunningTasksisApplicationBroughtToBackground上記の Dianne のコメントを参照し、そのメソッドも使用しないでください。

おすすめ記事