現在の表示可能なアプリケーションのパッケージ名を取得することが主な目的です。これはそれに責任があるコードです:ステータスバーをユーザー別に展開すると、getFrontPackage()機能が無効になる
try {
if (Build.VERSION.SDK_INT > 20) {
UsageStatsManager usm = (UsageStatsManager) service.getSystemService(Context.USAGE_STATS_SERVICE);
Calendar calendar = Calendar.getInstance();
long endTime = calendar.getTimeInMillis();
calendar.add(Calendar.DAY_OF_WEEK, -1);
long startTime = calendar.getTimeInMillis();
List<UsageStats> usageStatsList = usm.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, startTime, endTime);
if (usageStatsList != null && usageStatsList.size() > 0) {
Collections.sort(usageStatsList, new UsageStatsComparator());
UsageStats mUsageStats = usageStatsList.get(0);
return mUsageStats.getPackageName();
}
else {
if (!Utils.usageAccessGranted(service) && !directToSettingAlreadyTookPlace) {
launchUsageStatsSetting(service);
}
return "";
}
} else {
ActivityManager mActivityManager = (ActivityManager) service.getSystemService(Context.ACTIVITY_SERVICE);
return mActivityManager.getRunningTasks(1).get(0).topActivity.getPackageName();
}
} catch (Exception e) {
Log.e("Error", "Getting Front Package Failed " + e.toString());
return "";
}
これは私が使用するコンパレータである:
public class UsageStatsComparator implements Comparator<UsageStats> {
@Override
public int compare(UsageStats lhs, UsageStats rhs) {
if(Build.VERSION.SDK_INT > 20)
{
long time1 = lhs.getLastTimeUsed();
long time2 = rhs.getLastTimeUsed();
if (time1 > time2) {
return -1;
} else if (time1 < time2) {
return 1;
}
return 0;
}
else
return 0;
}
}
この問題はロリポップと前方のデバイス上にあります。
すべての機能は、ユーザーがステータスバーを使い切るまでうまくいきます。一度拡張すると、通知に関連するパッケージを取得し始めます。最も問題のあるのは、ユーザーがステータスバーを閉じるときです。私は表示されているアプリケーションのパッケージを取得していない、ステータスバーが開いたときに受け取った最後のパッケージを取得します。
これは、大きな問題を引き起こし、望ましい機能を引き起こす可能性があります。
私は、次の方法を試してみました:ステータスバーを拡張した場合
は、通知を取得します。私は深く検索しましたが、私が見つけた唯一の解決策はアクティビティでしか処理できませんが、私の場合はサービスできません...
マイサービスは、バーをカスタムリモートビューとして表示します。通知がユーザーに表示されているかどうかを知る方法を見つけようとしましたが、成功しませんでした。
どのように対処するか考えていますか?
はあなたをしました上記のAPI 20のgetRunningAppProcesses()を試してみてください。 – santoXme
@santoXme IgetRunningAppProcesses()は、デバイス上で実行中のすべてのプロセスのリストを返します。私はそれを前に試してみたが、どれが前の行動であるのか分からなかった。私はそれが私の比較にあると感じています。私は私の答えを編集し、私のcomparoatorを追加しました –