我想跟踪或检测用户何时尝试在Facebook或yahoo或gmail或任何其他应用程序中的移动设备上打开应用程序。 例如: - 要知道这些是应用程序用户在过去30分钟内打开的。
答案 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版本的不同技术。
答案 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
课程中实现的。