2016-03-30 33 views
2

私のアプリケーションの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); 
} 

ありがとうございます。

答えて

0

私のアプリケーションの設定を見ると、許可の痕跡がなかったので、許可PACKAGE_USAGE_STATSが本当に次の機能のおかげで許可されているかどうかを確認することにしました。

public static boolean isPermissionGranted(Context context, String permission) 
{ 
    AppOpsManager appOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE); 
    int mode = appOps.checkOpNoThrow(permission, android.os.Process.myUid(), context.getPackageName()); 
    boolean granted = mode == AppOpsManager.MODE_ALLOWED; 

    Log.i(TAG, "isPermissionGranted(" + permission + ", " + android.os.Process.myUid() + ", " + context.getPackageName() + ") : " + granted); 

    return granted; 
} 

私はアプリケーションをデバッグモードでテストしていましたが、前の許可を許可するように要求しませんでした。ターミナルとadbのコマンドラインのおかげで、私は手動で許可を与えました。私の関数isAppForegroundは、以前のEDITで定義されていました。

adb -d shell pm grant com.package.name android.permission.PACKAGE_USAGE_STATS

関連する問題