【问题标题】:Listener when an application is started?应用程序启动时的监听器?
【发布时间】:2014-10-19 11:14:34
【问题描述】:

有没有办法实现一个监听器,当任何应用程序启动时通知?不是我的应用程序任何应用程序启动或停止?

如果不可能,是否有办法查明特定应用程序是否已启动或停止,即 Facebook 应用程序(例如)启动或停止时的侦听器?

【问题讨论】:

    标签: android android-intent android-activity android-library


    【解决方案1】:

    使用跟踪所有正在运行的应用程序的 STICKY 服务

    @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;
    }
    

    【讨论】:

    • 我在这里收到一个错误 nullpointerexception !stalkList.contains(services.get(i).baseActivity.getPackageName())。你能告诉我如何解决这个问题吗?
    【解决方案2】:

    你可以像我在这里做的那样: https://github.com/ligi/Setec-Astronomy

    但是对于较新版本的 android 是不可能的,因为您在日志中不再有所需的条目:-(

    【讨论】:

      猜你喜欢
      • 2011-11-27
      • 1970-01-01
      • 1970-01-01
      • 2010-12-30
      • 2018-07-17
      • 1970-01-01
      • 2019-01-21
      • 2023-02-01
      • 1970-01-01
      相关资源
      最近更新 更多