首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当用户打开另一个应用程序时,我如何拦截意图?

当用户打开另一个应用程序时,我如何拦截意图?
EN

Stack Overflow用户
提问于 2015-10-07 08:26:03
回答 3查看 3.7K关注 0票数 3

让我们假设用户打开“设置”应用程序,有没有办法“拦截”这个意图,从我的应用程序的服务,以检测“设置”应用程序将被打开?

例如,在SOTI MobiControl应用程序中,您可以(通过web仪表板)管理安装了应用程序(并注册到服务器)的用户的权限。如果您不允许一个用户打开Settings应用程序,当他试图打开它时,会出现一个祝酒词,上面写着“未经授权”。他们是怎么做到的?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-10-23 03:26:48

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

正如前面提到的,拦截发射意图是不可能的。

例如,在SOTI MobiControl应用程序中,您可以(通过web仪表板)管理安装了应用程序(并注册到服务器)的用户的权限。如果您不允许一个用户打开Settings应用程序,当他试图打开它时,会出现一个祝酒词,上面写着“未经授权”。他们是怎么做到的?

然而,这是可能的,以确定一个应用程序是否打开和“拦截”该呼叫。截取,我的意思是在开始的应用程序的屏幕上绘制,并呈现一个登录屏幕或未经授权的屏幕。

我还没有想出一个可以运行任何安卓版本的完整样本,但从我对AppLocks的研究来看,我认为它或多或少是这样工作的:

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

代码语言:javascript
复制
    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...
        }
    }

要求:

代码语言:javascript
复制
<uses-permission android:name="android.permission.GET_TASKS"/>

或者另一种选择:

代码语言:javascript
复制
    for (ActivityManager.RunningTaskInfo recentTaskInfo : manager.getRunningTasks(100)) {
        Log.e("TAG", "Recent tasks: " + recentTaskInfo.baseActivity.getPackageName());
    }

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

代码语言:javascript
复制
    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());
    }

要求:

代码语言:javascript
复制
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"/>

我可能会使用AlarmManager来运行这两个循环任务。

我相当肯定这是获得运行应用程序列表的两种方法。如果使用统计数据的权限被拒绝给AppLock,那么它将不再使用Android6.0设备。然而,在预M设备上,它仍然有效,这表明该应用程序有一种获得正在运行的应用程序列表的替代方法(上面描述的第一个选项)。

一旦确定某个应用程序已经启动(它正在运行,上次检查时还没有运行),我们就可以“接管”屏幕。我就是这么做的:http://www.piwai.info/chatheads-basics/

当然,这只是基本的想法,我相信在实现一个可靠的解决方案时会有一些缺陷,但是这应该会给您提供一些开始。

票数 2
EN

Stack Overflow用户

发布于 2015-10-07 08:42:22

这样做违反了Google Play Developer Program Policy,因为它在其系统干扰部分中指出:

  • 从Google (或其组件或派生元素)下载的应用程序不得在未经用户知情和同意的情况下在应用程序之外对用户的设备进行更改。
  • 这包括替换或重新排序应用程序、小部件或设备上的设置的默认表示。如果应用程序在用户知情和同意的情况下进行这样的更改,用户必须清楚是哪个应用程序进行了更改,用户必须能够轻松地逆转更改,或者完全卸载该应用程序。
  • 应用程序及其广告不得修改或添加浏览器设置或书签,不得在用户设备上添加主屏幕快捷方式或图标,作为向第三方或广告目的提供的服务。
  • 应用程序及其广告不得通过系统显示广告。 用户设备上的级别通知,除非通知 从安装的应用程序提供的一个完整功能中派生出来(例如,通知用户特价的航空应用程序),或者是一款游戏 通知用户游戏中的促销活动)。
  • 应用程序不得鼓励、激励或误导用户删除或禁用第三方应用程序,除非作为安全服务的一部分。 由应用程序提供。

us/about/developer-content-policy.html

票数 4
EN

Stack Overflow用户

发布于 2015-10-22 22:55:24

让我们假设用户打开“设置”应用程序,有没有办法“拦截”这个意图,从我的应用程序的服务,以检测“设置”应用程序将被打开?

不,除非您是第一个调用startActivity()来启动应用程序的人。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32987302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档