【问题标题】:Android - Efficient way to pass event notifications to activity that may not be active?Android - 将事件通知传递给可能未激活的活动的有效方法?
【发布时间】:2011-07-09 03:22:43
【问题描述】:

我有一个复杂的应用程序,它具有后台线程(可能在服务中),当它们从互联网接收数据时,需要通知我的主要显示活动(以更新多个状态指示器)。所有都在同一个进程中运行(我认为没有理由不这样做)。

但是,在某些情况下,这些事件很频繁 - 每秒 5 个。此外,当活动不可见甚至被破坏时,可能会发生这些事件。我认为关于这个问题的唯一新颖之处在于效率问题。例如,我仍然以 G1 为目标。

this thread中提到了很多方法,但是不知道哪一个足够高效,如果activity被销毁了还能工作。这些方法是我更愿意遵循的“Android 方式”。

我有三种丑陋的反 Android 方法,但它们也有缺点:

  1. 在活动中有一个等待信号量的线程,并在释放时进行更新。缺点:多线程,如何处理几种事件类型
  2. 与 #1 类似,但使用并发阻塞队列对象。缺点:额外的线程,同类型的事件可能会多次进入队列(不好)
  3. 保持对活动处理程序的静态引用,并使用它来运行更新程序。缺点:(a)可能会泄露对activity的引用? (b) 当活动改变状态时会发生什么? (c) 当只需要一个时,可能会出现多个可运行文件。

【问题讨论】:

    标签: android service android-activity android-notifications


    【解决方案1】:

    此外,当 Activity 不可见甚至被销毁时,可能会发生这些事件。

    如果您的 Activity 被销毁,则无需更新任何内容。如果以及当用户选择重新访问该活动时,该活动可以在onResume() 中获取当前信息以进行显示。

    如果您的活动在后台,也没有什么需要更新的。同样,如果当用户选择重新访问该活动时,活动可以在onResume() 中获取当前信息以进行显示。

    唯一需要实时通知活动的时间是活动是否在前台。在这种情况下,我在the answer you linked 中概述的任何解决方案都可以工作。绑定选项或Messenger 可能是最轻量级的解决方案。

    我有一个复杂的应用程序,它有后台线程(可能在服务中)

    如果它们要超出任何给定活动实例的范围,则不是“可能”——“必须”。

    我有三种丑陋的反 Android 方法

    如果没有潜在的内存泄漏,这些都无法工作。

    【讨论】:

    • 谢谢。显然,当活动不可见时,无需更新活动。此解决方案是否需要让活动在隐藏时与服务断开连接?
    • @Mesocyclone:对于绑定模式,您应该通过onDestroy() 解除绑定,可能更早——这取决于您的业务逻辑。不要忘记在处理配置更改时将绑定本身作为状态来处理。
    猜你喜欢
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多