2010-07-21 9 views

risposta

9

È possibile ottenere informazioni sui processi in esecuzione utilizzando la classe ActivityManager.

11

È Non possibile rilevare un lancio App in Android, ma è possibile ottenere l'elenco delle applicazioni attualmente aperte e verificare se l'applicazione che state cercando è aperto o non utilizzando il seguente codice:

ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 
List<ActivityManager.RunningAppProcessInfo> runningAppProcessInfo = am.getRunningAppProcesses(); 

for (int i = 0; i < runningAppProcessInfo.size(); i++) { 
    if(runningAppProcessInfo.get(i).processName.equals("com.the.app.you.are.looking.for")) { 
    // Do your stuff here. 
    } 
} 

si può anche verificare se l'applicazione è in esecuzione in primo piano utilizzando questo metodo

public static boolean isForeground(Context ctx, String myPackage){ 
    ActivityManager manager = (ActivityManager) ctx.getSystemService(ACTIVITY_SERVICE); 
    List<ActivityManager.RunningTaskInfo> runningTaskInfo = manager.getRunningTasks(1); 

    ComponentName componentInfo = runningTaskInfo.get(0).topActivity; 
    if(componentInfo.getPackageName().equals(myPackage)) { 
     return true; 
    }  
    return false; 
} 
+2

Il primo frammento di codice di cui sopra funziona alla grande per le applicazioni che sono in esecuzione in lo sfondo. Grazie. – mbonness

+1

Non funziona in tutti i casi. Ad esempio, ho aperto Chrome e chiuso utilizzando il pulsante Home. E ho potuto vedere "Chrome" nella lista "cronologia app"/"app in esecuzione". E ho tolto il cromo da lì. Ancora il codice sopra dice che "Chrome" è in esecuzione sullo sfondo. – Manu

+0

@Manu Forse il processo è ancora lì, allora? –

2
public static String getActiveApps(Context context) { 

    PackageManager pm = context.getPackageManager(); 
    List<ApplicationInfo> packages = pm.getInstalledApplications(PackageManager.GET_META_DATA); 

    String value = u.dateStamp(); // basic date stamp 
    value += "---------------------------------\n"; 
    value += "Active Apps\n"; 
    value += "=================================\n"; 

    for (ApplicationInfo packageInfo : packages) { 

     //system apps! get out 
     if (!isSTOPPED(packageInfo) && !isSYSTEM(packageInfo)) { 

      value += getApplicationLabel(context, packageInfo.packageName) + "\n" + packageInfo.packageName + "\n-----------------------\n"; 

     } 
    } 

    return value; 

    //result on my emulator 

    /* 2 Ekim 2017 Pazartesi 14:35:17 
    --------------------------------- 
    Active Apps 
    ================================= 
    SystemSetting 
    com.xyz.systemsetting 
    ----------------------- 
    myMail 
    com.my.mail 
    ----------------------- 
    X-plore 
    com.lonelycatgames.Xplore 
    ----------------------- 
    Renotify 
    com.liamlang.renotify 
    ----------------------- 
    Mail Box 
    com.mailbox.email 
    ----------------------- */ 


} 

some opened apps

isSTOPPED

private static boolean isSTOPPED(ApplicationInfo pkgInfo) { 

    return ((pkgInfo.flags & ApplicationInfo.FLAG_STOPPED) != 0); 
} 

IsSystem

private static boolean isSYSTEM(ApplicationInfo pkgInfo) { 

    return ((pkgInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0); 
} 

getApplicationLabel

public static String getApplicationLabel(Context context, String packageName) { 

    PackageManager  packageManager = context.getPackageManager(); 
    List<ApplicationInfo> packages  = packageManager.getInstalledApplications(PackageManager.GET_META_DATA); 
    String    label   = null; 

    for (int i = 0; i < packages.size(); i++) { 

     ApplicationInfo temp = packages.get(i); 

     if (temp.packageName.equals(packageName)) 
      label = packageManager.getApplicationLabel(temp).toString(); 
    } 

    return label; 
} 
+0

Poco ridondante, ma ha funzionato in Android N. –

Problemi correlati