2015-12-18 2 views
2

Как получить наивысшее название деятельности в Lollipop?Lollipop: Получить наивысшее название деятельности

((ActivityManager)getSystemService(Context.ACTIVITY_SERVICE)). 
    getRunningTasks(1).get(0).topActivity 

не более доступны для Lollipop:

 * @deprecated As of {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this method 
    * is no longer available to third party 
    * applications: the introduction of document-centric recents means 
    * it can leak person information to the caller. For backwards compatibility, 
    * it will still retu rn a small subset of its data: at least the caller's 
    * own tasks, and possibly some other tasks 
    * such as home that are known to not be sensitive. 

Вызов из onResume в MyActivity

MyApplication.getInstance().saveCurentActivity(MyActivity.this) 
saveCurentActivity(Activity a) { 
    this.activityName = a.getClass().getSimpleName(); 
} 

не хорошая идея, потому что MyApplication может быть уничтожена в случае ошибки (например, NPE).

+0

Пожалуйста, проверьте мой ответ на аналогичный вопрос. http://stackoverflow.com/a/36660429/4554069 – AmAnDroid

ответ

0

Я не знаком с оригинальным API, который вы используете, но вы можете отслеживать изменения активности жизненного цикла в вашего приложения, используя ActivityLifecycleCallbacks, которые могут быть зарегистрированы с помощью Application.registerActivityLifecycleCallbacks. Он будет уведомляться всякий раз, когда действие создается, запускается, возобновляется и т. Д. Возможно, вы сможете отслеживать текущее действие с помощью крючков onActivityResumed и onActivityPaused.

+0

хорошая идея, но как я могу хранить имена? Не в экземпляре MyApplication. – VKDev

+0

Что вы делаете с именами? Не могли бы вы сохранить в ActivityLifeCycleCallback и сделать его одиночным или статическим экземпляром? – cwbowron

+0

Мне нужно сохранить текущее имя верхней активности в переменной для использования в моей логике. Послушайте, пожалуйста, ваше решение. – VKDev

1

Этот код работает для меня.

ActivityManager activityManager = (ActivityManager) context.getSystemService(Activity.ACTIVITY_SERVICE); 
List<ActivityManager.RunningTaskInfo> taskInfo = activityManager.getRunningTasks(1); 
String currentTopActivity = taskInfo.get(0).topActivity.getClassName(); 

Он даст TopActivity.

+0

getRunningTasks устарел – VKDev

+0

Используйте getAppTasks() и gettaskinfo вместо этого .... как показано ниже List tasks = activityManager.getAppTasks(); ActivityManager.RecentTaskInfo taskInfo = tasks.get (0) .getTaskInfo(); – user3863488

1

Это работает для меня:

   long end = System.currentTimeMillis(); 
       long INTERVAL=2000; 
       long begin = end - INTERVAL; 
       if (Build.VERSION.SDK_INT >= 21) { 
        UsageStatsManager us = (UsageStatsManager) MyServices.this.getSystemService(Context.USAGE_STATS_SERVICE); 
        UsageEvents usageEvents = us.queryEvents(begin, end); 
        while (usageEvents.hasNextEvent()) { 
         UsageEvents.Event event = new UsageEvents.Event(); 
         usageEvents.getNextEvent(event); 
         if (event.getEventType() == UsageEvents.Event.MOVE_TO_FOREGROUND) { 
          Log.e("event", "timestamp : " + event.getTimeStamp()); 
          Log.e("event", "package name : " + event.getPackageName()); 
          Log.e("event", "Class name : " + event.getClassName()); 
          //You can find activity name as Class name  

         } 

        } 
       }