【问题标题】:How can an Android Service know that its not bound to any ActivitiesAndroid 服务如何知道它没有绑定到任何活动
【发布时间】:2010-06-05 14:48:18
【问题描述】:

我有一个 Android 服务,即使在最后一个 Activity 已从堆栈中弹出或用户选择执行其他操作后,我仍希望它继续运行。

本质上,服务正在侦听远程服务器上的更改,当且仅当来自应用程序的活动未运行(或可见)时,我想生成通知。换句话说,我不希望在用户直接与应用程序交互时发生通知。

在用户直接与应用交互的情况下,Service 将通知 Activity 并根据更改更新适当的 UI 元素。我计划通过观察者模式来实现这一点。

服务如何知道是否没有任何应用活动绑定到它?

谢谢, J

【问题讨论】:

    标签: android service android-activity


    【解决方案1】:

    您需要在 onBind、onUnbind 和 onRebind 方法中使用布尔值:

    public boolean bound;
    
    @Override
    public Binder onBind(Intent intent){
        bound = true;
        return myBinder; //declare and init your binder elsewhere
    }
    
    @Override
    public boolean onUnbind(Intent intent) {
        bound = false;
        return true; // ensures onRebind is called
    }
    
    @Override
    public void onRebind(Intent intent) {
        bound = true;
    }
    

    onUnbind 仅在 所有 客户端断开连接时调用。因此 bound 将保持 true 直到所有客户端断开连接。

    ** 注意:根据 Gil 的反馈编辑。 **

    【讨论】:

    • 如果您知道您将永远只有一个绑定客户端,这很好。但是,如果您有两个或更多,它将无法正常工作。将“绑定”更改为 int 并跟踪绑定客户端的数量。否则,在您的情况下,如果有两个连接的客户端并且在断开连接时,“绑定”将设置为“假”。
    • @psiphi75: onUnbind 仅在所有客户端断开连接时调用,因此您无需跟踪绑定客户端的数量。
    【解决方案2】:

    我无法评论 SharkAlley 的回答,所以我在这里重播。

    不幸的是,onBind() 每次客户端连接时没有调用。例如,在这里查看 Hackborne 夫人的回答:https://groups.google.com/d/msg/android-developers/2IegSgtGxyE/iXP3lBCH5SsJ

    一种可能的解决方案是从onUnbind() 返回true,并将onBind()onRebind() 上的标志设置为true(在onUnbind() 上设置为false)。

    【讨论】:

    • 我创建了一个测试项目来确认这一点并更新了我的答案。感谢您的反馈。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-06
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多