Broadcast Receiver to detect application start

后端 未结 2 1799
耶瑟儿~
耶瑟儿~ 2020-11-28 07:38

I want to capture the time whenever a user starts any application using my broadcast receiver. is it possible that a broadcast receiver can catch such an event?? if yes , i

相关标签:
2条回答
  • 2020-11-28 08:13

    You can't get a broadcast when someone starts any other app. The only thing you can do is start a service that polls and periodically checks if new apps have been started (using Reno's code above for example).

    Also if you start this service when the phone starts you have a reasonably good solution.

    0 讨论(0)
  • 2020-11-28 08:19

    The best you can do is create a STICKY Service that tracks all of the running application.

     @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<RunningTaskInfo> 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<RunningAppProcessInfo> procInfos = activityManager.getRunningAppProcesses();
                    for(int i = 0; i < procInfos.size(); i++) {  
    
                        ArrayList<String> runningPkgs = new ArrayList<String>(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 <RunningAppProcessInfo> l = activityManager.getRunningAppProcesses();
        Iterator <RunningAppProcessInfo> 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 <RunningServiceInfo> l = activityManager.getRunningServices(9999);
        Iterator <RunningServiceInfo> 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 <RunningAppProcessInfo> l = activityManager.getRunningAppProcesses();
        Iterator <RunningAppProcessInfo> 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 <ActivityManager.RunningTaskInfo> l = activityManager.getRunningTasks(9999);
        Iterator <ActivityManager.RunningTaskInfo> 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;
    }
    
    0 讨论(0)
提交回复
热议问题