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

我试图build立一个应用程序,我的应用程序在后台运行,并检测用户何时启动另一个应用程序,以便我可以控制从其上的stream量。 为了说明我的查询,我想指定一个例子。 我的应用程序在后台运行(如服务),用户只需点击应用程序“XYZ”。 我的应用程序可能检测到应用程序“XYZ”已启动? 不仅仅是检测'XYZ的活动是否已经到达前台,我想要检测'XYZ'是否已经启动。 说有人推出'Whatsapp Messenger',我想知道我的应用程序是否可以知道'Whatsapp Messenger'已经启动。

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

在此先感谢,Sumit。

不知道如果这是做到这一点的最好方法,但它的工作原理,你可以使用logcat ,看看它的输出,你可以使用这个权限

 android.permission.READ_LOGS 

并使用下面的代码:

 try { Process mLogcatProc = null; BufferedReader reader = null; mLogcatProc = Runtime.getRuntime().exec(new String[]{"logcat", "-d"}); reader = new BufferedReader(new InputStreamReader(mLogcatProc.getInputStream())); String line; final StringBuilder log = new StringBuilder(); String separator = System.getProperty("line.separator"); while ((line = reader.readLine()) != null) { log.append(line); log.append(separator); } String w = log.toString(); Toast.makeText(getApplicationContext(),w, Toast.LENGTH_LONG).show(); } catch (Exception e) { Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show(); } 

并且不要忘记它在android清单上的权限,你可以把这个代码添加到一个线程中来工作

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

从adb shell命令是,

 adb logcat ActivityManager:I *:S 

从您的应用程序代码,

 logcat ActivityManager:I *:S 

在Logcat中,你可以find类似的东西,

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

当任何应用程序将启动。

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

更新:

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

 android.permission.READ_LOGS 

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

你应该从哪里去? 我想你应该尝试一个LogCat应用程序。 它是绿色和开源的。 这将帮助您实际读取日志。

尽pipe如此,所有这些都被认为是Android的安全漏洞。

我已经做了一个服务,可以检测到其他应用程序启动。 我已经做了拨号。 同样可以被任何包名取代。

 @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”variables启动。 手机应用程序在后台时使用phoneclosed,并相应地设置variables。

所有这些都在Service类中实现

在我的书中,顺便提一下你的问题,这听起来像一个应用程序在某种程度上让你的服务控制,恶意软件jinx毗邻。 但是它不会在Android中工作 – 由于每个应用程序的权限不同,所以简单和简单。 从而,每个应用程序彼此隔离。 所以直接回答你的问题,它的号码

正如其他答案build议 – 你可以监视logcat但是..然后再…为什么?