Detectar cuando otra aplicación se abrió o se inició

Me gustaría rastrear o detectar cuando el usuario intenta abrir una aplicación en el móvil como facebook o yahoo o gmail o cualquier otra aplicación. Por ejemplo: – Conocer estos son los usuarios de aplicaciones que se han abierto en los últimos 30 minutos.

No puedes detectar el lanzamiento de una aplicación en Android. Pero puedes obtener la lista de aplicaciones abiertas actualmente usando este código y comprobar si la aplicación que estás buscando está abierta o no:

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 you stuff } } 

También puede comprobar si la aplicación se está ejecutando en primer plano mediante 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; } 

Con la ayuda de @ aaRBiyecH respuesta he hecho un servicio que puede detectar si se inicia otra aplicación. Lo he hecho para el dialer. Similarmente que puede ser reemplazado por cualquier nombre de paquete.

 @Override public int onStartCommand(Intent intent, int flags, int startId){ Toast.makeText(this,"Service Started", Toast.LENGTH_LONG).show(); final String str = ""; Timer timer = new Timer(); timer.scheduleAtFixedRate(new TimerTask() { int phonelaunched = 0,phoneclosed =0; int phonelaunches = 1; @Override public void run() { ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningAppProcessInfo> runningAppProcessInfo = am.getRunningAppProcesses(); for ( ActivityManager.RunningAppProcessInfo appProcess: runningAppProcessInfo ) { Log.d(appProcess.processName.toString(),"is running"); if (appProcess.processName.equals("com.android.dialer")) { if ( appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND /*isForeground(getApplicationContext(),runningAppProcessInfo.get(i).processName)*/){ if (phonelaunched == 0 ){ phonelaunched = 1; Log.d(str,"dude phone has been launched"); } else if (phoneclosed == 1){ phonelaunches++; phoneclosed = 0; Log.d(String.valueOf(phonelaunches),"dude that was counter"); } } else { phoneclosed = 1; Log.d(str,"dude phone has been closed"); } } } } },2000,3000); return START_STICKY; } 

Aquí voy a través de todas las tareas en ejecución y comprobar si es nuestra aplicación prevista. Si es así, compruebo si la aplicación es de primer plano y la aplicación nunca se inicia con la variable 'phonelaunched'. Phoneclosed se utiliza cuando la aplicación prevista está en segundo plano y la variable se establece en consecuencia.

Todo esto se implementa en la clase de servicio

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.