Come si chiama `getTopActivity` o si sta correntemente eseguendo il nome del pacchetto dell’applicazione in lollipop?

Sto creando un’applicazione di blocco dell’app. Come ottenere l’attività corrente in esecuzione in lecca-lecca? getRunningTaskinfo metodo è deprecato in API lollipop, quindi come superare questo problema?

    prova questo:

     ActivityManager mActivityManager =(ActivityManager)this.getSystemService(Context.ACTIVITY_SERVICE); if(Build.VERSION.SDK_INT > 20){ String mPackageName = mActivityManager.getRunningAppProcesses().get(0).processName; } else{ String mpackageName = mActivityManager.getRunningTasks(1).get(0).topActivity.getPackageName(); } 

    possiamo usare UsageStats:

     public static String getTopAppName(Context context) { ActivityManager mActivityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); String strName = ""; try { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { strName = getLollipopFGAppPackageName(context); } else { strName = mActivityManager.getRunningTasks(1).get(0).topActivity.getClassName(); } } catch (Exception e) { e.printStackTrace(); } return strName; } private static String getLollipopFGAppPackageName(Context ctx) { try { UsageStatsManager usageStatsManager = (UsageStatsManager) ctx.getSystemService("usagestats"); long milliSecs = 60 * 1000; Date date = new Date(); List queryUsageStats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, date.getTime() - milliSecs, date.getTime()); if (queryUsageStats.size() > 0) { Log.i("LPU", "queryUsageStats size: " + queryUsageStats.size()); } long recentTime = 0; String recentPkg = ""; for (int i = 0; i < queryUsageStats.size(); i++) { UsageStats stats = queryUsageStats.get(i); if (i == 0 && !"org.pervacio.pvadiag".equals(stats.getPackageName())) { Log.i("LPU", "PackageName: " + stats.getPackageName() + " " + stats.getLastTimeStamp()); } if (stats.getLastTimeStamp() > recentTime) { recentTime = stats.getLastTimeStamp(); recentPkg = stats.getPackageName(); } } return recentPkg; } catch (Exception e) { e.printStackTrace(); } return ""; } 

    // PER ABILITARE USAGE_STATS

      // Declare USAGE_STATS permisssion in manifest  Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS); startActivity(intent); 

    Sei sicuro? Come posso vedere secondo gli ultimi documenti di Android, l’aggiornamento di LOLLIPOP non ti consente di conoscere alcuna informazione su altre app oltre la tua !?

    http://developer.android.com/reference/android/app/ActivityManager.html Puoi vedere che tutti questi metodi sono deprecati!

    La migliore soluzione per ottenere l’app in esecuzione in API 21 o versioni successive è provare. questo lavoro per me

     private String retriveNewApp() { if (VERSION.SDK_INT >= 21) { String currentApp = null; UsageStatsManager usm = (UsageStatsManager) this.getSystemService(Context.USAGE_STATS_SERVICE); long time = System.currentTimeMillis(); List applist = usm.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, time - 1000 * 1000, time); if (applist != null && applist.size() > 0) { SortedMap mySortedMap = new TreeMap<>(); for (UsageStats usageStats : applist) { mySortedMap.put(usageStats.getLastTimeUsed(), usageStats); } if (mySortedMap != null && !mySortedMap.isEmpty()) { currentApp = mySortedMap.get(mySortedMap.lastKey()).getPackageName(); } } Log.e(TAG, "Current App in foreground is: " + currentApp); return currentApp; } else { ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); String mm=(manager.getRunningTasks(1).get(0)).topActivity.getPackageName(); Log.e(TAG, "Current App in foreground is: " + mm); return mm; } } 

    È ansible utilizzare AccessibilityService per ottenere l’attuale app in esecuzione. Il servizio di accessibilità fornisce l’evento onAccessibilityEvent.

    Di seguito è riportato un codice di esempio.

     @Override public void onAccessibilityEvent(AccessibilityEvent event) { if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) { if (event.getPackageName() != null && event.getClassName() != null) { Log.d("Foreground App", event.getPackageName().toString()); } } } 

    Puoi trovare maggiori informazioni sul servizio di accessibilità qui

    Prova questo .. Questo ha funzionato per me.

     ActivityManager activityManager = (ActivityManager) getSystemService (Context.ACTIVITY_SERVICE); if (Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP) { String packageName = activityManager.getRunningAppProcesses().get(0).processName; } else if(Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) { String packageName = ProcessManager.getRunningForegroundApps(getApplicationContext()).get(0).getPackageName(); } else { String packageName = activityManager.getRunningTasks(1).get(0).topActivity.getPackageName(); } 

    Può essere raggiunto in questo modo …..

     ActivityManager am =(ActivityManager)context.getSystemService(ACTIVITY_SERVICE); List tasks = am.getRunningTasks(1); ActivityManager.RunningTaskInfo task = tasks.get(0); // current task ComponentName rootActivity = task.baseActivity; rootActivity.getPackageName();//*currently active applications package name* 

    Per il lecca lecca:

     ActivityManager mActivityManager =(ActivityManager)this.getSystemService(Context.ACTIVITY_SERVICE); if(Build.VERSION.SDK_INT > 20){ String activityName =mActivityManager.getRunningAppProcesses().get(0).processName; } else{ String activityName = mActivityManager.getRunningTasks(1).get(0).topActivity.getPackageName(); } 

    per un esempio completo controlla questo …

    @Manish La risposta di Godhani ( https://stackoverflow.com/a/38829083/8179249 ) funziona molto bene, ma devi dare i permessi giusti per questo!

    Vedi i due primi punti di quella risposta: https://stackoverflow.com/a/42560422/8179249

    Funziona per me (prima di aggiungere permessi stavo ottenendo anche ‘null’), come mostrato di seguito: Risultati forniti dal codice di quella risposta, dopo aver aggiunto le autorizzazioni

    Uso un modo hacky per ottenere il nome dell’attività principale. Ogni volta che creo o riprendo un’attività, salvi il nome in SharedPreferences. Ho creato due funzioni per salvare e ottenere la topClass su e da SharedPreferences. Questo sovrascrive sempre l’ultima attività e dà l’attività principale. Non devo preoccuparmi delle autorizzazioni e dei livelli API. Abbastanza semplice, ma sicuramente non è il modo migliore per farlo.