从状态栏通知意图中删除或关闭自己的活动窗口



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

谢谢你的帮助。

hackky但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://stackoverflow.com/a/6403577/327011但我从来没有与行动,所以我不确定会发生什么,如果多个活动有相同的行动。


:

你应该使用LocalBroadcastManager而不是"global" Broadcasts来避免发送全局广播。

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

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

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

在共享对象上使用synchronized方法来锁定对象,如果共享对象是由于调用lock()函数而被锁定,则返回true,如果共享对象已经被其他活动锁定,则返回false。然后调用活动可以决定它是否应该简单地死亡(结果为false -已经锁定),或者它是否需要承担告诉其他活动死亡的责任(结果为true -第一次锁定)。

通过这种方式,应用程序可以通过编程方式直接删除其活动的意图,而不依赖于可能排除无辜旁观者或可能错过某些活动的广播机制。接收原始删除意图的活动可以验证其他活动在其消亡之前已经死亡,以增加健壮性。

最新更新