【问题标题】:postNotification from BroadcastReceiver only if activity not active仅当活动不活动时来自 BroadcastReceiver 的 postNotification
【发布时间】:2012-09-15 19:39:33
【问题描述】:

我有一个 BroadcastReceiver(#1),它一直在运行以捕获事件。当事件发生时,它可能需要对特定活动进行 UI 更改(如果该活动处于活动状态)。为此,我让 BroadcastReceiver#1 创建了一个新意图,该意图被活动上的第二个 BroadcastReceiver(#2) 捕获,并且仅在 Activity 未暂停时才注册/取消注册……如此处所述: Inform Activity from a BroadcastReceiver ONLY if it is in the foreground

一切正常...但是,现在我希望 BroadcastReceiver#1 在活动未聚焦或聚焦但选择不处理事件时发布状态通知。因此,Activity(如果处于活动状态)需要某种方式与 BroadcastReceiver#1 进行通信。

我想我会让 BroadcastReceiver#1 产生一个线程,该线程将在 X 秒后发布带有通知的事件...该线程将有第三个 broadcastreceiver#3,如果接收活动选择处理事件,它可以发送一个“不要打扰发布该通知”的意图,该意图将被 BroadcastReceiver#3 捕获以中止通知。但是,这不起作用,因为 Android 不允许一个 BroadcastReceiver 注册另一个 BroadcastReceiver。

【问题讨论】:

    标签: android android-activity notifications broadcastreceiver


    【解决方案1】:

    从未使用过,但应该可以。 就在发送广播查询之前,是否有任何广播接收者准备好处理您的意图。

    PackageManager pm = context.getPackageManager();
    List<ResolveInfo>  mList = pm.queryBroadcastReceivers(intent, 0);
    
    if(mList.size() > 0){
     //broadcast intent
    }else{
     //post notification
    }
    

    编辑: 由于这不适用于通过活动注册的接收者,因此您可以使用 Application 类跟踪注册和取消注册。 由于正在使用相同的应用程序和流程,您可以使用辅助函数来注册和取消注册并保持注册计数并决定是发布通知还是广播意图

    【讨论】:

    • 不幸的是,这实际上并没有解决最初的问题,因为即使活动处于活动状态并准备好接收广播并不意味着它会处理它。在这种情况下,活动是一个聊天窗口......如果您当前正在与该人聊天,那么活动将处理该事件。否则,如果与其他人打开聊天活动,那么我仍然想要状态通知...
    • 实际上,我意识到,因为意图过滤器只是一个字符串,我可以将通常的通用过滤器字符串与特定的 ID 结合起来......然后你的方法似乎是有效的。但是,在对其进行测试时,似乎 queryBroadcastReceivers 只返回在清单中静态注册的接收...并且不计算动态注册的广播接收器...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多