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

Android 从我的后台服务检测(任何)应用程序(即活动)启动的最佳方法?,android,service,intentfilter,timertask,Android,Service,Intentfilter,Timertask,我的应用程序有后台服务。在服务中,我需要检测并记录所有应用程序启动。例如:无论用户打开Facebook、Google+或Twitter(任何应用程序)——我希望我的服务中有一个接收者捕捉到它,让我执行一个动作 我能够做到这一点的唯一方法是在我的服务的onCreate()函数中运行一个计时器。我担心的是-这个1秒计时器可能会耗尽电池电量 这个假设正确吗 如果是,是否有其他方法(一些意图过滤器?)可以向广播接收器注册以捕获任何应用程序启动 我尝试过的事情: (1) 我的服务代码和TimerTask。

我的应用程序有后台服务。在服务中,我需要检测并记录所有应用程序启动。例如:无论用户打开Facebook、Google+或Twitter(任何应用程序)——我希望我的服务中有一个接收者捕捉到它,让我执行一个动作

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

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

    (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,但没有发现任何适合此用例的意图。


    我只想知道任何应用程序活动何时启动(即在前台),这样我就不必不断地检查计时器(担心它会耗尽电池)

    也许我对这个问题的回答可能会对您有所帮助

    将该代码放在后台服务中

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

    EDIT:因为您需要连续检查,所以可以使用AsyncTask(),在doInBackground()函数中,只需不断获取每次迭代中运行的活动列表,就像我在该链接中建议的那样,任务信息列表中的第一项将在前台显示活动/应用程序。您还可以在应用程序中提供另一个按钮,通过在共享首选项中保留一个bool变量(您可以在AsyncTask()的doInBackGround()函数中的while条件中轮询该变量),单击该按钮即可停止此操作


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

    我知道如何获取前台应用程序包名称,问题是我应该将其放在服务的何处?如果我将其放在onCreate()中,前台活动只检查一次。我希望每次启动应用程序/活动时都检查它。我是否遗漏了什么?因此,基本上,您希望跟踪自应用程序启动以来激活的所有应用程序,对吗?是的。如果我将您的代码放在onCreate()中,我是否正确解释了您的答案对于我的服务,它将只运行一次…但我需要在用户启动任何应用程序时保持记录。按照我的建议尝试使用Asynctask。我不知道这是否是最好的方法。但它确实有效,如果您想继续监视某个应用程序,则必须采用类似的方法或您之前尝试过的方法。