【问题标题】:Remove or close your own Activity window from a Status Bar Notification Intent从状态栏通知意图中删除或关闭您自己的活动窗口
【发布时间】:2025-12-21 23:25:11
【问题描述】:

我有一个“警报”应用程序,其中有几种不同的警报类型,可以在任何给定时间触发。当警报响起时,它会添加一个状态栏通知。当用户使用状态栏中的“全部清除”按钮时,我希望删除意图从屏幕上删除并关闭警报活动窗口。我怎样才能做到这一点?因为我的警报活动不是单任务活动,所以可以一次创建多个活动窗口,所以我不能只使用带有 onNewIntent() 函数将运行并关闭活动本身的一些数据的 Intent。我需要找到一种从 Activity 外部终止警报窗口的方法。

感谢您的帮助。

【问题讨论】:

    标签: android


    【解决方案1】:

    Hacky 但 100% 有效的解决方案:您可以发送一个 Broadcast,所有活动都在等待,然后调用 finish()

    private String action = "clear";
    private String type = "content://whatever_you_like"; //You should read stuff about this because it's a hack..
    

    每个Activity的onCreate:

      clearStackManager = new ClearStackManager();
                registerReceiver(clearStackManager,
                        IntentFilter.create(action, type));
    

    然后定义它:

     private final class ClearStackManager extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            finish();
        }
    }
    

    onDestroy:

    unregisterReceiver(clearStackManager);
    

    调用它:

     public void clearStack() {
        Intent intent = new Intent(action);
        intent.setType(type);
        sendBroadcast(intent);
    }
    

    开箱即用的解决方案: 使用 FLAG CLEAR_TOP(删除除此之外的所有活动)按意图调用堆栈的第一个活动(如果它始终相同),然后在 onNewIntent 上完成最后一个活动一个。


    我不知道它是否有效解决方案:我还发现了这个:https://*.com/a/6403577/327011 但我从未使用过动作,所以我不确定如果多个活动具有相同的动作会发生什么。


    更新

    您应该使用 LocalBroadcastManager 而不是“全局”广播以避免发送全局广播。

    http://developer.android.com/reference/android/support/v4/content/LocalBroadcastManager.html

    【讨论】:

    • 我没有机会对此进行测试,但一旦我这样做并且它有效,我就会选择它作为答案。
    • 通过意图从通知发送广播是要走的路。然后活动可以监听这个广播并采取相应的行动。您还可以将 Intent 中的数据发送到 Activity 以触发特定行为。
    【解决方案2】:

    这是一个包含多个活动的单个应用程序,每个活动都是一个警报窗口吗?

    如果是这样,那么如何将每个活动的 id 注册到一个由应用程序的所有活动共享的单例对象中?从状态栏接收删除意图的(第一个)活动锁定单例对象,迭代活动集合,向每个活动(除了自身(activityId == this))发送删除意图,然后退出自身。其他活动确定共享对象已被锁定并自行终止。

    在共享对象上使用同步方法来锁定对象,如果共享对象由于调用 lock() 函数而被锁定,则返回 true,如果共享对象已被另一个活动锁定,则返回 false。调用活动然后可以确定它是否应该简单地死亡(结果为假 - 已锁定)或是否需要负责告诉其他活动死亡(结果为真 - 第一次锁定)。

    这样,应用程序能够以编程方式将删除意图指向其活动,而无需依赖可能会带走无辜旁观者或可能错过某些活动的广播机制。接收到原始删除意图的 Activity 可以验证其他 Activity 在其消亡之前已经死亡,以提高稳健性。

    【讨论】:

    • 为什么是-1?不想开始讨论,但想了解原因并学习。
    • 我没有把它撞下来,所以我不确定,但恕我直言,提议的解决方案似乎有点复杂。它还提出了一些可能不应该存在于活动内部的行为(即迭代和杀死其他活动)。无论如何,只是我的想法。很高兴看到你正在努力学习!!!
    最近更新 更多