Broadcast Receiver para detectar el inicio de la aplicación

Quiero capturar la hora cada vez que un usuario inicia cualquier aplicación usando mi receptor de difusión. ¿Es posible que un receptor de difusión pueda atrapar tal evento? Si es así, ¿hay algún permiso que pueda hacer eso?

Lo mejor que puede hacer es crear un servicio STICKY que rastree toda la aplicación en ejecución.

@Override public int onStartCommand(Intent intent, int flags, int startId) { Timer timer = new Timer(); timer.scheduleAtFixedRate(new TimerTask() { public void run() { final ActivityManager activityManager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE); final List services = activityManager.getRunningTasks(Integer.MAX_VALUE); for (int i = 0; i < services.size(); i++) { if(!stalkList.contains(services.get(i).baseActivity.getPackageName())) { // you may broad cast a new application launch here. stalkList.add(services.get(i).baseActivity.getPackageName()); } } List procInfos = activityManager.getRunningAppProcesses(); for(int i = 0; i < procInfos.size(); i++) { ArrayList runningPkgs = new ArrayList(Arrays.asList(procInfos.get(i).pkgList)); Collection diff = subtractSets(runningPkgs, stalkList); if(diff != null) { stalkList.removeAll(diff); } } } }, 20000, 6000); // every 6 seconds return START_STICKY; } private RunningAppProcessInfo getForegroundApp() { RunningAppProcessInfo result = null, info = null; final ActivityManager activityManager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE); List  l = activityManager.getRunningAppProcesses(); Iterator  i = l.iterator(); while(i.hasNext()) { info = i.next(); if(info.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND && !isRunningService(info.processName)) { result = info; break; } } return result; } private boolean isRunningService(String processName) { if(processName == null) return false; RunningServiceInfo service; final ActivityManager activityManager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE); List  l = activityManager.getRunningServices(9999); Iterator  i = l.iterator(); while(i.hasNext()){ service = i.next(); if(service.process.equals(processName)) return true; } return false; } private boolean isRunningApp(String processName) { if(processName == null) return false; RunningAppProcessInfo app; final ActivityManager activityManager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE); List  l = activityManager.getRunningAppProcesses(); Iterator  i = l.iterator(); while(i.hasNext()){ app = i.next(); if(app.processName.equals(processName) && app.importance != RunningAppProcessInfo.IMPORTANCE_SERVICE) return true; } return false; } private boolean checkifThisIsActive(RunningAppProcessInfo target){ boolean result = false; ActivityManager.RunningTaskInfo info; if(target == null) return false; final ActivityManager activityManager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE); List  l = activityManager.getRunningTasks(9999); Iterator  i = l.iterator(); while(i.hasNext()){ info=i.next(); if(info.baseActivity.getPackageName().equals(target.processName)) { result = true; break; } } return result; } // what is in b that is not in a ? public static Collection subtractSets(Collection a, Collection b) { Collection result = new ArrayList(b); result.removeAll(a); return result; } 

No se puede transmitir cuando alguien inicia otra aplicación. Lo único que puede hacer es iniciar un servicio que sondee y verifique periódicamente si se han iniciado nuevas aplicaciones (usando el código de Reno anterior, por ejemplo).

Además, si inicia este servicio cuando se inicia el teléfono, tiene una solución razonablemente buena.