检测其他应用程序何时打开或启动

时间:2014-03-19 09:13:34

标签: android

我想跟踪或检测用户何时尝试在Facebook或yahoo或gmail或任何其他应用程序中的移动设备上打开应用程序。 例如: - 要知道这些是应用程序用户在过去30分钟内打开的。

3 个答案:

答案 0 :(得分:8)

无法检测Android中的应用启动。但是,您可以使用此代码获取当前打开的应用列表,并检查您正在寻找的应用是否已打开:

ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> runningAppProcessInfo = am.getRunningAppProcesses();

for (int i = 0; i < runningAppProcessInfo.size(); i++) {
  if(runningAppProcessInfo.get(i).processName.equals("com.the.app.you.are.looking.for") {
    // Do you stuff
  }
}

您还可以使用此方法检查应用是否在前台运行

public static boolean isForeground(Context ctx, String myPackage){
    ActivityManager manager = (ActivityManager) ctx.getSystemService(ACTIVITY_SERVICE);
    List< ActivityManager.RunningTaskInfo > runningTaskInfo = manager.getRunningTasks(1); 

    ComponentName componentInfo = runningTaskInfo.get(0).topActivity;
    if(componentInfo.getPackageName().equals(myPackage)) {
        return true;
    }       
    return false;
}

答案 1 :(得分:0)

该库试图提供一种简单的方法来获取前台应用程序包的名称。它使用了适合该设备的android版本的不同技术。

https://github.com/ricvalerio/foregroundappchecker

答案 2 :(得分:-2)

在@ aaRBiyecH的答案的帮助下,我创建了一个服务,可以检测其他应用程序是否启动。在此示例中,服务检测到Android Dialer应用程序(com.android.dialer):

@Override
public int onStartCommand(Intent intent, int flags, int startId){
    private static final String TAG = "com.myapp.Service"; // Replace this with your actual class' name
    Timer timer  =  new Timer();
    timer.scheduleAtFixedRate(new TimerTask() {
        boolean isDialerAppLaunched = false, isDialerAppClosed = false;
        int dialerAppLaunches = 0;
        @Override
        public void run() {
            ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
            List<ActivityManager.RunningAppProcessInfo> runningAppProcessInfo = am.getRunningAppProcesses();

            for ( ActivityManager.RunningAppProcessInfo appProcess: runningAppProcessInfo ) {
                Log.d(appProcess.processName.toString(),"is running");
                if (appProcess.processName.equals("com.android.dialer")) {
                    if ( appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND){
                        if (!isDialerAppLaunched){
                            isDialerAppLaunched = true;
                            Log.d(TAG, "Dialer app has been launched");
                        }
                        else if (isDialerAppClosed){
                            phonelaunches++;
                            isDialerAppClosed = false;
                            Log.d("Dialer app has been launched " + String.valueOf(phonelaunches) + "times.");
                        }
                    }
                    else {
                        isDialerAppClosed = true;
                        Log.d(str,"Dialer app has been closed.");

                    }
                }
            }
        }
    },2000,3000);

    return START_STICKY;
}

在这里,我将完成所有正在运行的任务,并检查它是否是我们的预期应用程序。如果是这样,我检查应用程序是否在前台,并且永远不会使用isDialerAppLaunched变量启动应用程序。当预期的应用程序在后台并且相应地设置变量时,使用isDialerAppClosed

所有这些都是在Service课程中实现的。