2015-12-10 6 views
18

現在表示されているユーザーのアプリケーションを特定しようとしています。 これを行うには、activityManager.getRunningAppProcesses()メソッドを使用します。activityManager.getRunningAppProcesses()を使用してフォアグラウンドプロセスを取得する(リアル)

この方法はAndroid 5.1.1ではサポートされていません。これは問題ありません。

最初は魅力的でしたが、私はRunningAppProcessInfosのリスト を繰り返して重要性をチェックしています。

tl; dr 現在のフォアグラウンドプロセスを取得し、誤検出を防止する正しい方法は何ですか?リストの順序はどのように行われますか?APIは指定されていないと指示します。それらを正しく注文する方法はありますか?私がやっていること

を不幸にActivityManagerによって返されたリストは、すべてのデバイス上で異なっています。一部のデバイスは、プロセスが現在表示されていなくても、重要度100(FOREGROUND)の複数の情報を返します。

これは、私が誤検出が多いという問題を引き起こしました。 たとえば、 のfacebookがフォアグラウンドになるたびに、facebookでテストし、トーストを作成しました。私はホームに切り替えたので、ランチャーには がフォアグラウンドプロセスになっているはずです。それは10秒後、そのあとフェイスブック がリストに重要なFOREGROUNDで表示されました(それは開いていても見えませんでした)、私は偽陽性になりました。

一部のデバイスでは、最近のプロセスによってリストが上に並べられていることが認識されました。 だから私は、次のようなアプローチしようとすることを決めた:appProcesses.get(0)で

ActivityManager.RunningAppProcessInfo appProcess = appProcesses.get(0); 
     final String processName = appProcess.processName; 
     final String packageName = removeProcessSuffix(processName); 
     if (appProcess.importance == FOREGROUND || appProcess.importance == VISIBLE){ 
      //do something, like the toast 
     } 

を。私は最初の要素だけを調べ、バグは消えました。もはや偽陽性はない。

しかし、、今では一部のデバイスでは、フォアグラウンドプロセスがもうありません。彼らは決してリストを注文しないので。 たとえば、ソニーの一部のスマートフォンが候補者の一部です。私はリストを取得しますが、実際に目に見えるプロセスはインデックス11程度です。

偽陽性のない、現在のフォアグラウンドプロセスを得るために何をすべきかわからない。

現在のフォアグラウンドプロセスを取得し、誤ったポストを防ぐ正しい方法は何ですか?リストの順序はどのように行われますか?APIは指定されていないと指示します。 正しく注文する方法はありますか?

ありがとうございました!

+0

これはhttp://stackoverflow.com/questions/2166961/determining-the-current-foreground-application-from-a-background-task-or-serviceの似ています。 – alzee

+0

私はテストしませんでしたが、これはあなたに役立つように見えます:http://stackoverflow.com/a/33886313/4973904 –

+0

@ÁlissonMoraisさて、最初は応答に感謝しましたが、完全な質問をお読みですか?返されたリストの最初の項目のみを使用することはできません。これは、30%のデバイスではリストがソートされないためです。 – JacksOnF1re

答えて

3

現在のフォアグラウンドのプロセスを取得し、 偽陽性を防止するための正しい方法は何ですか?

UsageStatsManagerは、現在実行中のアプリ(see #50)を取得する唯一の公式のAPIです。

getRunningTasks(int maxNum),getRunningAppProcesses()またはAccessibilityServiceを使用すると、フォアグラウンドアプリケーションを取得することは決して信頼できませんでした。最初の2つの方法の説明は次の警告があります。以下は、Note: this method is only intended for debugging


UsageStatsManagerを使用して、トップのアプリを取得するための例です:

Calendar endCal = Calendar.getInstance(); 
Calendar beginCal = Calendar.getInstance(); 
beginCal.add(Calendar.MINUTE, -30); 
UsageStatsManager manager = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE); 
List<UsageStats> stats = manager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, 
    beginCal.getTimeInMillis(), endCal.getTimeInMillis()); 
Collections.sort(stats, new Comparator<UsageStats>() { 

    @Override public int compare(UsageStats lhs, UsageStats rhs) { 
    long time1 = lhs.getLastTimeUsed(); 
    long time2 = rhs.getLastTimeUsed(); 
    if (time1 > time2) { 
     return -1; 
    } else if (time1 < time2) { 
     return 1; 
    } 
    return 0; 
    } 
}); 
// The first "UsageStats" in the list will be the top application. 
// If the list is empty you will need to ask for permissions to use UsageStatsManager 
// To request permission: 
// startActivity(new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS)); 

私はこれではありません知っていますあなたが望んでいる答え。 CM SecurityAppLockなどのアプリは、Android 5.1.1以降でUsageStatsManagerを使用します。 SeLinuxのために、getRunningTasks(int maxNum)またはgetRunningAppProcesses()を使用してフォアグラウンドアプリを取得することは不可能です。

+0

答えをありがとう!残念なことに、StatsManagerはSamsumgデバイスのほとんどでは機能しません(API 21の下では機能しません)。 :/ – JacksOnF1re

関連する問題