Как запустить работу приложения Имя в 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.
Ответы
Ответ 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