如何检测用户何时启动另一个应用程序? (机器人)

时间:2012-07-05 14:35:02

标签: android service

我正在尝试构建一个应用程序,其中我的应用程序在后台运行,并检测用户何时启动另一个应用程序,以便我可以从其上控制流量。 为了说明我的查询,我想指出一个例子。 我的应用程序在后台运行(比如服务),用户刚刚点击了应用程序'XYZ'。我的应用程序是否可以检测到应用程序“XYZ”已启动? 不仅仅是检测'XYZ的活动是否已经出现在前台,我想要检测“XYZ”是否已经启动。假设某人推出了“Whatsapp Messenger”,我想知道我的应用是否可以知道“Whatsapp Messenger”已经发布。

编辑:很多人认为我正在尝试构建恶意软件,但我不是。我正在尝试为高中项目构建一个应用程序。我想要一个统计数据来查看我将相机作为心理项目的一部分使用的频率。 :/

提前致谢, 萨米特。

4 个答案:

答案 0 :(得分:3)

是的,您可以通过跟踪 Logcat 找到启动的应用程序。只需使用 info -I 日志跟踪 ActivityManager 标记。

来自adb shell命令是,

adb logcat ActivityManager:I *:S

从您的应用程序代码

logcat ActivityManager:I *:S

在Logcat中,您可以找到类似

的行
I/ActivityManager(  585): Starting activity: Intent { action=android.intent.action...}

何时启动任何应用程序。

它是logcat输出,显示消息与优先级“I”和标记“ActivityManager”相关:

<强>更新

只需在应用程序的清单文件中添加权限

即可
android.permission.READ_LOGS

答案 1 :(得分:1)

我想您应该查看Google Play中的“app protector”应用程序。他们检测到用户启动了另一个应用这是通过读取系统日志来完成的。在设备上启动任何应用程序后,尝试打开LogCat并读取日志。你会感到惊讶。

你应该去哪里?我想你应该试试aLogCat app。它是freen和开源的。这将帮助您实际读取日志。

但是,所有这些都被一些开发人员认为是Android中的安全漏洞。

答案 2 :(得分:1)

我已经提供了一项服务,可以检测是否有其他应用程序启动。我已经为拨号器做了。类似地,可以用任何包名替换。

@Override
public int onStartCommand(Intent intent, int flags, int startId){
    Toast.makeText(this,"Service Started", Toast.LENGTH_LONG).show();

    final String str = "";
    Timer timer  =  new Timer();
    timer.scheduleAtFixedRate(new TimerTask() {
        int phonelaunched = 0,phoneclosed =0;
        int phonelaunches = 1;
        @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  /*isForeground(getApplicationContext(),runningAppProcessInfo.get(i).processName)*/){
                        if (phonelaunched == 0 ){
                            phonelaunched = 1;
                            Log.d(str,"dude phone has been launched");
                        }
                        else if (phoneclosed == 1){
                            phonelaunches++;
                            phoneclosed = 0;
                            Log.d(String.valueOf(phonelaunches),"dude that was counter");
                        }
                    }
                    else {
                        phoneclosed = 1;
                        Log.d(str,"dude phone has been closed");

                    }
                }
            }
        }
    },2000,3000);

    return START_STICKY;
}

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

所有这些都在服务

中实现

答案 3 :(得分:-2)

在我的书中,就你提出问题的方式而言,这听起来像是以某种方式为应用程序控制一个应用程序,接近恶意软件jinx。但它不适用于Android - 由于每个应用程序的权限不同而简单明了。从而,每个app彼此隔离。所以直截了当地回答你的问题,

正如另一个答案所暗示的那样 - 你可以监控logcat但是......然后再次......为什么?