私のアプリケーションの1つでは、Intent
(これは私のものではありません)のおかげで、手動でアプリケーションを起動する必要があります。その後、私はIntent
によって起動されたこのアプリケーションが、フォアグラウンドで、バックグラウンドで、または実行中であるかどうかを知りたい。アプリケーションがフォアグラウンドで実行されているかどうかの確認
実行中のプロセス/アプリケーションのリストを取得する方法を示すスニペットが多数見つかりましたが、API21以降で非推奨になっているメソッドを呼び出しています(ActivityManager.RunningTasks(..)
(http://developer.android.com/reference/android/app/ActivityManager.html)など)。
ActivityManager.RunningAppProcessInfo
のような他のメソッドは、現在のアプリケーションのみを返します。私はこれが個人情報へのアクセスのセキュリティ上の問題だと理解していますが、それ以外の方法はありませんか? How to get list of recent apps with Android API 21 Lollipop?:
EDIT 1
AndroidのAPIを見た後、私はクラスUsageStatsManager
、次のポストから判断を見つけ、代替のようです。私はUsageStatsManager
を使ってみましたが、結果は満足できません。選択したアプリケーションがフォアグラウンドにあるかどうかを定期的に確認するサービスを提供しています。
public class CastService extends Service
{
private static final String TAG = "CastService";
@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
ResolveInfo launchable = (ResolveInfo)intent.getExtras().get("selectedApp");
final String packageName = launchable.activityInfo.packageName;
final Handler handler = new Handler();
final int delay = 2000; // ms
handler.postDelayed(new Runnable()
{
@Override
public void run()
{
Log.i(TAG, "isAppInactive(" + packageName + ") : " + isAppInactive(packageName));
handler.postDelayed(this, delay);
}
}, delay);
return Service.START_NOT_STICKY;
}
@Override
public IBinder onBind(Intent intent)
{
return null;
}
protected boolean isAppInactive(String packageName)
{
UsageStatsManager usageStatsManager = (UsageStatsManager)getSystemService(Context.USAGE_STATS_SERVICE);
return usageStatsManager.isAppInactive(packageName);
}
}
サービスが正常に動作し、2秒ごとに方法isAppInactive
の結果をログに記録されます。 Unfortunatetly、心配アプリケーションがバックグラウンドで動作しているか、殺されたとしても、結果は変わっていません:
I/CastService: isAppInactive(com.sec.android.gallery3d) : false
私はAndroidManifest.xml
に権限を追加することを忘れ思ったけど、それはそれを修正しません。
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" tools:ignore="ProtectedPermissions"/>
別の例を見てみるとEDIT 2
()、私は私のisAppForeground
機能を書き直しましたが、まだ動作していません。 UsageStats
の私のリストは、常に空です。
protected boolean isAppForeground(String packageName)
{
UsageStatsManager usageStatsManager = (UsageStatsManager)getSystemService(Context.USAGE_STATS_SERVICE);
long time = System.currentTimeMillis();
List<UsageStats> stats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, time - 1000 * 10, time);
String topPackageName = new String();
if(stats != null)
{
SortedMap<Long,UsageStats> mySortedMap = new TreeMap<>();
for (UsageStats usageStats : stats)
{
mySortedMap.put(usageStats.getLastTimeUsed(),usageStats);
}
if(mySortedMap != null && !mySortedMap.isEmpty())
{
topPackageName = mySortedMap.get(mySortedMap.lastKey()).getPackageName();
}
}
return topPackageName.equals(packageName);
}
ありがとうございます。