从我的后台服务中检测(任何)应用程序(即活动)的最佳方法是什么?

时间:2014-02-05 09:59:25

标签: android service intentfilter timertask

我的应用程序有后台服务。在服务中,我需要检测并记录所有App启动。例如:用户是打开Facebook还是Google+或Twitter(任何应用程序) - 我希望我的服务中的接收器能够抓住它来执行操作。

我能够做到这一点的唯一方法是在我的服务的onCreate()函数中运行一个Timer。我担心的是 - 这个1秒计时器可能会耗尽电池电量。

  1. 这个假设是否正确?
  2. 如果是,是否有其他方式(某些意图过滤器?)我可以向我的广播接收器注册以捕获任何应用程序启动?
  3. 我尝试过的事情:

    (1)带有TimerTask的我的服务代码。我的触发器动作代码将放在TimerTask的“run()”函数内。

    public class KillService extends Service {
    
    ActivityManager mActivityManager;
    
    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        return null;
    }
    
    
    
    @Override
    public void onDestroy() {
        unregisterReceiver(receiver);
        super.onDestroy();
    }
    
    
    
    
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_STICKY;
    }
    
    @Override
    public void onCreate() {
        super.onCreate();
        Timer timer = new Timer();    
                TimerTask refresher = new TimerTask() {
                public void run() {
                       //PLACING MY TRIGGER ACTION HERE
            };
        };
        //TIMER RUNS EVERY 1 SECOND
        timer.scheduleAtFixedRate(refresher, 1000,1000);    
    
    }   
    }
    

    (2)已审核可用的广播操作 我查看了SDK文件夹(sdk \ platforms \ android-19 \ data)中的broadcast_actions.txt,但是我没有找到适合此用例的任何Intent。 Link to file

    我想要的只是知道什么时候开始任何App活动(即在前景中),这样我就不必再继续检查Timer(担心它可能会耗尽电池)

1 个答案:

答案 0 :(得分:0)

也许我在这个问题上的答案可能对你有帮助。 Android how to know an app has been started and range apps priority according the starting times

将该代码放在后台服务中。

根据前台活动的包名称,您可以通过检查手机上的所有应用并将其与具有相同包名称的应用相匹配来检测该应用名称。

编辑:由于您需要连续检查,可以使用 AsyncTask(),并且在doInBackground()函数中,只需继续获取每次迭代中正在运行的活动列表,就像我在该链接中建议的那样,并且 taskInfo 列表中的第一项将在前台具有活动/应用程序。你还可以在你的应用程序中提供另一个按钮,通过在共享首选项中保留一个bool变量(在 doInBackGround() AsyncTask()的功能。

我过去做过类似的事情,对我有用。