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

Ian*_*Ian 91 android broadcastreceiver android-intent

我正在尝试开发一个应用程序,防止用户在没有密码的情况下访问指定的应用程序.情景是......

  1. 用户点击"电子邮件"应用(例如)
  2. 我的应用检测到应用的启动
  3. 我的应用程序确认它是"电子邮件"应用程序
  4. 我的应用程序在顶部打开一个视图,要求输入密码
  5. 用户输入密码,如果正确,我的应用程序将消失,将"电子邮件"应用程序保留在最顶层

我正在做剩下的事情,只是第2部分令我感到困惑,经过多天阅读广播意图等并试图在我的试验项目中听"android.intent.action.MAIN"等我不能似乎检测到我的应用程序何时启动.

有人可以帮忙吗?我是否正确地寻找新的应用程序广播意图启动,或者我应该阅读系统日志以获取新意图,或者使用本机代码执行某些操作?

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

M.M*_*agh 34

我想我们可以使用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();
    }
Run Code Online (Sandbox Code Playgroud)

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

  • 将不会从JellyBean及以上工作.READ_LOGS权限现在仅为系统应用程序保留. (54认同)
  • 你对此绝对肯定吗?因为Smart AppLock似乎甚至可以在JB设备上执行此操作.是因为应用程序将自身升级到设备管理员状态?https://play.google.com/store/apps/details?id=com.thinkyeah.smartlockfree&feature=nav_other#?t=W251bGwsMSwxLDYsImNvbS50aGlua3llYWguc21hcnRsb2NrZnJlZSJd (5认同)

小智 19

花哨的方法是使用带有定时循环检查的服务

ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> runningAppProcessInfo = am.getRunningAppProcesses();
Run Code Online (Sandbox Code Playgroud)

您将浏览该列表以查看手机上正在运行的内容.现在你可以使用id和processName来识别它们,因此对于标准活动来说,这对于自定义活动来说很容易,除非你把它们全部停下来很难辨别......

注意:这不是一个实际上在屏幕上的列表,只是一个正在运行的列表...有点无效你的目标可能但至少你会知道什么时候开始运行......它将继续存在即使在后台也列出.

对于密码问题,您可以在找到受保护的应用程序或其他任何内容时启动您的活动.

  • 不会再在android L上运行,虽然答案很好. (5认同)
  • 在Android L中使用`android.app.usage`包代替.https://developer.android.com/reference/android/app/usage/package-summary.html (4认同)

Pon*_*gge 12

我想并希望这是不可能的.考虑恶意软件可以轻易滥用此类功能.您可以收听针对您的意图以及广播的意图,但应用程序启动不应该是广播事件.

您可以做的是更换发射器.如果用户同意.

  • +1解决问题的解决办法. (3认同)

Vea*_*rji 12

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以获得当前运行Activity并检查它是否ActivityEmail 应用程序相对应.

CheckRunningActivity ThreadApplication启动时运行(或在设备启动时运行).

new CheckRunningActivity().start();
Run Code Online (Sandbox Code Playgroud)

更新: 此类需要android.permission.GET_TASKS权限,因此在Manifest中添加下一行:

<uses-permission android:name="android.permission.GET_TASKS" />
Run Code Online (Sandbox Code Playgroud)

  • 在你的代码中,`Looper.loop()`语句看起来永远不会被执行,因为`while(true)`循环永远不会完成.这是一个错误吗? (2认同)

Cod*_*ile 10

主要问题是当Launcher(主屏幕)通常使用显式意图时,您正在尝试侦听隐式意图.

一个隐含的意图是当你想说"有人播放这个视频"时,Android选择一个可以处理这个意图的应用程序.

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

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

您要做的是违反Android安全模型.

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


Plo*_*oon 7

getRunningTasks() 在Android L.中已弃用

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

新的App使用统计API允许应用程序开发人员收集与应用程序使用情况相关的统计信息.与不推荐使用的getRecentTasks()方法相比,此API提供了更详细的使用信息.

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

是一个基本的应用程序示例,展示了如何使用App使用统计信息API来让用户收集与应用程序使用情况相关的统计信息.