2010-07-21 15 views

Respuesta

9

Puede obtener información sobre la ejecución de procesos utilizando la clase ActivityManager.

11

Usted no puede detectar un lanzamiento de aplicaciones en Android, pero se puede obtener la lista de aplicaciones abiertas actualmente y comprobar si la aplicación que estás buscando es abierto o no utilizando el siguiente código:

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. 
    } 
} 

también puede comprobar si la aplicación se está ejecutando en primer plano el uso de este método

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

El primer fragmento de código anterior funciona muy bien para las aplicaciones que se ejecutan en el fondo. Gracias. – mbonness

+1

No funciona en todos los casos. Por ejemplo, abrí Chrome y cerré usando el botón de inicio. Y pude ver "Chrome" en la lista de "historial de aplicaciones"/"aplicaciones en ejecución". Y eliminé cromo de allí. Aún así, el código anterior dice "Chrome" se está ejecutando en segundo plano. – Manu

+0

@Manu Quizás el proceso todavía está allí, entonces? –

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 redundante, pero funcionó en Android N. –

Cuestiones relacionadas