当用户打开另一个应用程序时,如何拦截Intent?

时间:2015-10-07 08:26:04

标签: android android-intent

让我们说用户打开"设置"应用程序,有没有办法拦截"这个意图,来自我的应用程序的服务,以便检测"设置"应用程序将被打开?

例如,在SOTI MobiControl应用程序中,您可以(通过Web仪表板)管理安装了应用程序(并注册到您的服务器)的用户的权限。如果您不允许一个用户打开“设置”应用,当他尝试打开它时,会出现一个“吐司”,说“未经授权”#34;。他们是怎么做到的?

3 个答案:

答案 0 :(得分:3)

这样做违反了Google Play开发者计划政策,正如其在系统干扰部分中所述:

  • 从Google Play下载的应用程序(或其组件或衍生产品 元素)不得对用户的设备进行更改 没有用户的知情和同意的应用程序。

  • 这包括替换或重新排序默认值等行为 应用程序,窗口小部件或设备上的设置的演示。如果 应用程序必须根据用户的知识和同意进行此类更改 向用户清楚哪个应用程序已进行更改且用户必须 能够轻松地撤消更改,或卸载应用程序 共

  • 应用及其广告不得修改或添加浏览器设置或 书签,在用户设备上添加主屏幕快捷方式或图标 为第三方提供服务或用于广告目的。

  • 应用及其广告不得通过系统显示广告
    用户设备上的级别通知,除非通知
    源自已安装应用程序提供的整体功能(例如, 一个航空公司应用程序,通知用户特殊交易,或游戏 通知用户游戏内促销活动。)

  • 应用不得鼓励,激励或误导用户删除 或禁用第三方应用程序,但作为安全服务的一部分除外 由应用程序提供。

https://play.google.com/intl/ALL_us/about/developer-content-policy.html

答案 1 :(得分:2)

  

有没有办法拦截"这个意图来自我的应用程序服务   以检测"设置"应用程序将被打开?

正如之前提到的那样,它无法拦截发射意图。

  

例如,在SOTI MobiControl应用程序中,您可以管理(从Web   仪表板)安装了应用程序的用户的权限(和   注册到您的服务器)。如果您不允许一个用户打开“设置”   应用程序,当他试图打开它时,一个吐司似乎说"未经授权"。   他们是怎么做到的?

然而,可以确定应用程序是否已打开并且"拦截"那个电话。通过拦截我的意思是绘制起始应用程序的屏幕并显示登录屏幕或未授权的屏幕。

我还没有找到适用于任何Android版本的完整示例,但是根据我对AppLocks的研究,我说这或多或少都是这样的:

在Lollipop Android之前,您可以使用它来检索正在运行的进程:

    ActivityManager manager = (ActivityManager)getSystemService(ACTIVITY_SERVICE);
    for (ActivityManager.RunningAppProcessInfo info : manager.getRunningAppProcesses()) {
        Log.e("TAG", "Running process: " + info.processName);
        if ("com.mycompany.mycoolapp".equals(info.processName)) {
           // do stuff...
        }
    }

需要:

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

或者:

    for (ActivityManager.RunningTaskInfo recentTaskInfo : manager.getRunningTasks(100)) {
        Log.e("TAG", "Recent tasks: " + recentTaskInfo.baseActivity.getPackageName());
    }

在Lollipop及更高版本上,您可以使用UsageStats来确定应用是否正在运行:

    UsageStatsManager usageStatsManager = (UsageStatsManager)getSystemService(USAGE_STATS_SERVICE);
    Calendar cal = Calendar.getInstance();
    cal.add(Calendar.YEAR, -1);
    long start = cal.getTimeInMillis();
    long end = System.currentTimeMillis();
    List<UsageStats> queryUsageStats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, start, end);
    for (UsageStats stats : queryUsageStats) {
        Log.e("TAG", "Usage stats for: " + stats.getPackageName());
    }

需要:

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

我可能会使用AlarmManager来执行该重复任务。

我相当确定这些是获取正在运行的应用列表的两种方法。如果AppLock拒绝使用统计信息的权限,则它不再适用于Android 6.0设备。在pre-M设备上,它仍然可以工作,这表明应用程序有另一种方法来获取正在运行的应用程序列表(上述第一个选项)。

一旦确定某个应用已启动(它正在运行并且我们上次检查时没有运行),我们就可以“接管”#34;屏幕。这就是我的表现:http://www.piwai.info/chatheads-basics/

当然这只是基本的想法,我确信在实施可靠的解决方案时会有一些陷阱,但这应该会给你一些启动。

答案 2 :(得分:0)

  

假设用户打开“设置”应用程序,有没有办法从我的应用程序服务中“拦截”此意图,以便检测“设置”应用程序是否会打开?

不,除非您是首先致电startActivity()以启动该应用程序的人。