Android,当其他应用程序启动时检测

我正在尝试开发一个应用程序,防止用户无需密码而到达指定的应用程序。 场景是…

  1. 用户点击“电子邮件”应用程序(例如)
  2. 我的应用检测到应用的启动
  3. 我的应用程序确认这是“电子邮件”应用程序
  4. 我的应用程序在顶部打开一个视图,要求input密码
  5. 用户input密码,如果正确,我的应用程序将消失,将“电子邮件”应用程序放在顶部

我可以做剩下的部分,只是第2部分令我感到困惑,而且经过多天阅读广播内容等,并试图在我的试验项目中听“android.intent.action.MAIN”等,我不能似乎检测到除我以外的应用程序启动。

谁能帮忙? 我是否以正确的方式去寻找新的应用程序,广播意图开始,还是应该阅读系统日志中的新意图,或在本地代码中做些什么?

任何指针都会有帮助,即使你不能完全回答,我也可以做更多的研究。 非常感谢。 伊恩

我想我们可以使用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(); } 

并且不要忘记在Manifest文件中添加它的权限。

做一个噱头的方法是有一个定时循环的服务来检查

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

你通过列表​​来看看手机上运行的是什么。 现在你可以用id和processName来识别它们,所以对于标准的活动,这很容易定制的,除非你停下来很难区分…

注意:这不是一个什么是实际在屏幕上的清单,只是一个什么是正在运行的列表…也许有点取消你的目标,但至less你会知道什么时候开始运行…它将继续在那即使在后台列表虽然。

对于密码的事情,你可以开始你的活动,当你发现一个应用程序保护或任何。

 class CheckRunningActivity extends Thread{ ActivityManager am = null; Context context = null; public CheckRunningActivity(Context con){ context = con; am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); } public void run(){ Looper.prepare(); while(true){ // Return a list of the tasks that are currently running, // with the most recent being first and older ones after in order. // Taken 1 inside getRunningTasks method means want to take only // top activity from stack and forgot the olders. List< ActivityManager.RunningTaskInfo > taskInfo = am.getRunningTasks(1); String currentRunningActivityName = taskInfo.get(0).topActivity.getClassName(); if (currentRunningActivityName.equals("PACKAGE_NAME.ACTIVITY_NAME")) { // show your activity here on top of PACKAGE_NAME.ACTIVITY_NAME } } Looper.loop(); } } 

你可以得到当前正在运行的Activity并检查这个Activity对应于Email应用程序。

Application启动(或在设备启动)上运行CheckRunningActivity Thread

 new CheckRunningActivity().start(); 

更新:这个类需要android.permission.GET_TASKS权限,所以添加下一行到清单:

 <uses-permission android:name="android.permission.GET_TASKS" /> 

主要的问题是,当启动器(主屏幕)通常使用显式意图时,您试图监听隐式意图。

一个隐含的意图是,当你想说“有人玩这个video”,Androidselect一个可以处理这个意图的应用程序。

当您单击主屏幕上的“电子邮件”图标时,会出现一个明确的意图。 它具体告诉Android通过完全限定的名称(即com.android.mail或其他)打开该特定的应用程序。

AFAIK没有办法拦截这种明确的意图。 这是Android内置的安全措施,任何两个活动都不能具有相同的完全限定的软件包名称。 这可以防止第三方克隆应用程序,并伪装成该应用程序。 如果你想做的事情是可能的,你理论上可以安装一个应用程序,可以阻止你所有的竞争对手的应用程序工作。

你所要做的是违背Android安全模式。

你可以做的一件事是与特定的应用程序开发者合作,将意图转发给你的安全系统,但这可能不是你想要处理的事情。

我想,希望这是不可能的。 考虑一下这种function如何被恶意软件滥用。 您可以听取针对您的意图以及广播的意图,但是应用程序启动不应该是广播事件。

你可以做的是取代发射器 。 如果用户同意。

getRunningTasks()中不推荐使用getRunningTasks()

要获取应用程序使用统计信息,您可以使用android.app.usage包中的UsageStats类。

新的应用程序使用统计API允许应用程序开发人员收集与应用程序使用相关的统计信息。 此API提供比弃用的getRecentTasks()方法更详细的使用信息。

要使用此API,您必须首先在清单中声明android.permission.PACKAGE_USAGE_STATS权限。 用户还必须通过Settings > Security > Apps with usage access程序Settings > Security > Apps with usage access启用此应用程序的Settings > Security > Apps with usage access

以下是一个基本的应用程序示例,展示了如何使用App usage statistics API让用户收集与应用程序使用相关的统计信息。

也许你需要一个服务,不断在后台运行。 比你的服务做你所说的。 听android.intent.action.MAIN与类别android.intent.category.LAUNCHER。 然后让广播接收机重写onReceive方法,并检查应用程序的名称等