web-dev-qa-db-fra.com

Comment faire pour exécuter l'activité de l'application Nom dans Android 5.0 (L)?

J'utilise le code suivant pour obtenir le nom de l'activité en cours dans Android.

ActivityManager am = (ActivityManager) aContext
                .getSystemService(Context.ACTIVITY_SERVICE);            
List<ActivityManager.RunningTaskInfo> alltasks = am
                .getRunningTasks(1);

ComponentName componentInfo = alltasks.get(0).topActivity;
componentInfo.getClassName();

System.out.println("Current:"+componentInfo.getClassName());

Cela fonctionne correctement dans toutes les versions ci-dessous Android 5.0. Mais dans Android 5.0, il renvoie toujours l’activité de lancement .

S'il vous plaît n'importe quelle aide dans ceci parce que je veux faire exécuter l'application dans toutes les versions d'Android.

13
Krishna

Avant Android L, votre code fonctionnera, mais à partir d’Android L, getRunningTask ne fonctionnera pas. Vous devez utiliser getAppRunningProcess.

Vérifiez ce code ci-dessous - 

public class DetectCalendarLaunchRunnable implements Runnable {

@Override
public void run() {
  String[] activePackages;
  if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KitKat_WATCH) {
    activePackages = getActivePackages();
  } else {
    activePackages = getActivePackagesCompat();
  }
  if (activePackages != null) {
    for (String activePackage : activePackages) {
      if (activePackage.equals("com.google.Android.calendar")) {
        //Calendar app is launched, do something
      }
    }
  }
  mHandler.postDelayed(this, 1000);
}

String[] getActivePackagesCompat() {
  final List<ActivityManager.RunningTaskInfo> taskInfo = mActivityManager.getRunningTasks(1);
  final ComponentName componentName = taskInfo.get(0).topActivity;
  final String[] activePackages = new String[1];
  activePackages[0] = componentName.getPackageName();
  return activePackages;
}

String[] getActivePackages() {
  final Set<String> activePackages = new HashSet<String>();
  final List<ActivityManager.RunningAppProcessInfo> processInfos = mActivityManager.getRunningAppProcesses();
  for (ActivityManager.RunningAppProcessInfo processInfo : processInfos) {
    if (processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
      activePackages.addAll(Arrays.asList(processInfo.pkgList));
    }
  }
  return activePackages.toArray(new String[activePackages.size()]);
}
}  

J'espère que cela vous aide :)

15
Ashish Tamrakar

Vous pouvez utiliser ceci:

String packageName = "";
String className = "";

UsageStatsManager usageStatsManager = (UsageStatsManager) this.getSystemService(Context.USAGE_STATS_SERVICE);

if (usageStatsManager != null)
{
   UsageEvents queryEvents = usageStatsManager.queryEvents(System.currentTimeMillis() - 10000, System.currentTimeMillis());

   if (queryEvents != null) 
   {
      UsageEvents.Event event = new UsageEvents.Event();

      while (queryEvents.hasNextEvent()) 
      {
          UsageEvents.Event eventAux = new UsageEvents.Event();
          queryEvents2.getNextEvent(eventAux);

          if (eventAux.getEventType() == UsageEvents.Event.MOVE_TO_FOREGROUND)
          {
              event = eventAux;
          }
      }

      packageName = event.getPackageName();
      className = event.getClassName();
   }
}

Vous avez besoin de Android.permission.PACKAGE_USAGE_STATS, qui est une autorisation système et ne sera pas accordé aux applications tierces. Toutefois, la déclaration de l'autorisation implique l'intention d'utiliser l'API et l'utilisateur du périphérique peut accorder l'autorisation à l'aide de l'application Paramètres. 

Ou tu peux faire:

pm grant com.your.package Android.permission.PACKAGE_USAGE_STATS
2
Ismael

Veuillez vérifier link .

Malheureusement, Android 5.0 n’a pas d’équivalent: il n’est pas possible d’obtenir la majeure partie de l’activité, ni d’être rappelé si une nouvelle application/activité est lancée en temps réel.

méthodes déployées en 5.0

0
Imtiyaz Khalani