9

我正在尝试构建一个应用程序,我的应用程序在后台运行,并检测用户何时启动另一个应用程序,以便我可以控制其上的流程。为了说明我的查询,我想指定一个示例。我的应用程序在后台运行(例如作为服务),并且用户刚刚单击了应用程序“XYZ”。我的应用程序是否可以检测到应用程序“XYZ”已启动?不仅仅是检测 'XYZ's Activity 是否出现在前台,我想检测'XYZ' 是否已经启动。假设有人启动“Whatsapp Messenger”,我想知道我的应用程序是否可以知道“Whatsapp Messenger”已启动。

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

在此先感谢,苏米特。

4

4 回答 4

3

是的,您可以通过 Tracking the Logcat找到启动了哪个应用程序。只需使用info -I log跟踪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
于 2012-07-05T14:46:42.167 回答
1

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

你应该从那里去哪里?我想你应该试试 LogCat应用程序。它是自由和开源的。这将帮助您实际阅读日志。

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

于 2012-07-05T14:46:28.900 回答
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;
}

在这里,我浏览了所有正在运行的任务并检查它是否是我们的预期应用程序。如果是这样,我检查应用程序是否在前台,并且应用程序从未使用“phonelaunched”变量启动。当预期的应用程序在后台并相应地设置变量时,使用 phoneclosed。

所有这些都在Service类中实现

于 2015-07-13T10:28:21.797 回答
-1

在我的书中,顺便说一下你提出问题的方式,这听起来像是以某种方式劫持应用程序以供你的服务控制,接近恶意软件的恶作剧。但它不适用于 Android - 由于每个应用程序的权限不同,因此简单明了。因此,每个应用程序都是相互隔离的。所以直截了当地回答你的问题,它不是。

正如另一个答案所建议的那样-您可以监视logcat但是..然后又...为什么?

于 2012-07-05T14:46:54.377 回答