Подтвердить что ты не робот

Как запустить работу приложения Имя в android 5.0 (L)?

Я использую следующий код, чтобы получить текущее имя текущей работы в 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());

Это отлично работает во всех версиях ниже android 5.0. Но в Android 5.0 он всегда возвращает активность запуска.

Пожалуйста, помогите мне в этом, потому что я хочу запустить приложение во всех версиях Android.

4b9b3361

Ответ 1

До Android L ваш код будет работать, но с Android L onward getRunningTask не будет работать. Вы должны использовать getAppRunningProcess.

Проверьте этот код ниже -

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()]);
}
}  

Надеюсь, это поможет вам:)

Ответ 2

Вы можете использовать это:

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();
   }
}

Вам нужен файл android.permission.PACKAGE_USAGE_STATS, который является разрешением на системном уровне и не будет предоставлен сторонним приложениям. Тем не менее, объявление разрешения подразумевает намерение использовать API, и пользователь устройства может предоставить разрешение через приложение "Настройки".

Или вы можете сделать:

pm grant com.your.package android.permission.PACKAGE_USAGE_STATS

Ответ 3

Пожалуйста, проверьте ссылку.

К сожалению, в Android 5.0 нет эквивалента: невозможно получить самую большую активность, а также невозможно получить обратный вызов при запуске нового приложения/активности в реальном времени.

методы, выделенные в 5.0