【问题标题】:Get notified when an activity or task changes在活动或任务更改时收到通知
【发布时间】:2015-06-30 22:05:02
【问题描述】:

android系统有什么方法可以通知服务系统中的活动或任务(只有我的活动/任务!)以某种方式发生了变化(例如,另一个活动被带到前面还是停止)?当然,这是为了避免轮询相同的信息。

有一个相同的问题here,但它是在 3 年前提出的,所以在此期间,也许有人对此有答案?作为对这个问题的补充:如果答案是否定的,是否有人可以通过例如低级编程或其他方式来增强此功能?

【问题讨论】:

    标签: android android-activity android-service


    【解决方案1】:

    不,没有通用的解决方案。您只能将这些信息记录在您自己活动的生命周期方法中。从 Android 5 开始,连轮询都不起作用。 ActivityManager#getRecentTasks() 被削弱了。来自文档:

    此方法在 API 级别 21 中已弃用。截至LOLLIPOP,此方法不再可用于第三方应用程序:引入以文档为中心的最新消息意味着它可能会将个人信息泄露给调用者。为了向后兼容,它仍然会返回其数据的一小部分:至少是调用者自己的任务(尽管请参阅getAppTasks() 以了解获取该信息的正确支持方式),以及可能已知的其他一些任务,例如 home不要敏感。

    由于这被认为是一个安全问题,你可以打赌,如果有一个低级的方法可以做到这一点,谷歌最终会发现并破解它。

    【讨论】:

    • 是的,我知道此 API 更改。可以从 Lollipop 向上使用 UsageStats。
    • 至于安全方面:如果活动或任务发生了不知何故发生了变化,我们谈论的是一个无辜的通知,甚至不是如何发生的。我看不出这些信息是如何有害的。您只需知道足够的信息,您的服务就会醒来并查看发生了什么。
    • @C.S.可能是。但是UsageStats 需要一个只能通过系统活动授予的隐藏权限,并且记录表明系统活动可能不会出现在所有设备上。值得注意的是,三星已将其从棒棒糖设备中删除。因此,如果您的解决方案基于 UsageStats API,则您选择不支持三星设备。
    • 我不知道三星删除了这个权限,哈哈。好吧,基本上没有支持的方式来知道当前处于前台的活动是什么?那么,我们需要一些巧妙的技巧 ;-)
    • @C.S.显然 LG 也删除了它。至于安全问题,谷歌的理念似乎是用户都是白痴,如果允许他们做任何远程有趣的事情,Android 设备将立即被恶意软件接管。这就是为什么 Android 永远不会成为通用计算平台的原因。这和谷歌讨厌开发者,他们最近愤怒地关闭了 11,000 份错误报告等就证明了这一点。
    【解决方案2】:

    activity lifecycle events 不是已经涵盖了您想要的内容吗?

    onPause() 和 onResume() 还不够吗?

    【讨论】:

    • 是的,如果我我的活动感兴趣。我对整个系统以及任何活动是否发生变化感兴趣。请更仔细地阅读问题/参考链接的问题。那里的答案和你的问题一样。
    【解决方案3】:

    我觉得懒对不起,试试这个逻辑。

    检查此post。您想要在这里实现的是记录当前正在运行的所有任务;并且在你不断检查的循环中,当一个任务死亡时,你会通过检查整个正在运行的任务得到通知,循环遍历你就会知道谁死了——但这并不限于所有版本,有些人会告诉你,不是就是为了这个。

    【讨论】:

    • 我很欣赏这个答案,但你们真的能在回答之前阅读这个问题吗? ^^ 我明确表示我想避免轮询。我知道如何做到这一点,这不是问题所在。但由于这种方法需要定期检查自己是否有更新,所以这不是我想要的。
    • 我很抱歉先生没有注意@C.S.但是处理全局任务需要大量输入,因为据我所知,android 不希望你处理它,而是它本身,所以要到达那里你需要深入得多,但是嘿,我的想法只是我的想法。
    猜你喜欢
    • 2011-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    • 1970-01-01
    相关资源
    最近更新 更多