Android删除堆栈中的Activity问题

项目要求是这样的,一个Activity用来展示信息,根据信息状态的不同该Activity显示的内容也不同。现在如果出现信息状态相同的情况,要把前面一个Activity销毁掉。所以我的策略是在Application中创建一个HashMap,用键值存储Activity。当有新的Activity进来的时候我们把它销毁掉。代码如下

    // 添加报警Activity-在onCreate中调用
    public void addAlertActivity(String activityname, Activity activity) {
        Activity result = AlertActivityList.get(activityname);
        if (result == null) {
            Log.e("addAlertActivity1", activityname);
            AlertActivityList.put(activityname, activity);
        } else {
            result.finish();
            result = null;
            AlertActivityList.put(activityname, activity);
        }
    }

    // 移除报警页面存储 - 在 onDestroy中调用
    public void removeAlertActivity(String activityname) {
        AlertActivityList.remove(activityname);
    }

但是出现了一个很奇怪的问题,我每次调用完打生命周期发现我调用finish方法并不是马上就调用了OnDestroy,最直观的例子就是我上面一个Activity销毁后,原本应该要被销毁的Activity还在。如果我慢点销毁最上层的Activity,等到下面的Activity出现了OnDestroy的时候,下面就没有了。
Acitivity的代码如下

    protected void onCreate(Bundle savedInstanceState) {
    ((AniniApplication)getApplication()).addAlertActivity(alert_eid+tag, this);
    }
    onDestroy{
            ((AniniApplication)getApplication()).removeAlertActivity(alert_eid+tag);
    }

至于Activity启动是在服务中启动的

 it = new Intent(getBaseContext(), alert.class);
        it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                                getApplication().startActivity(it);

我Activity使用了Dialog样式

  <style name="MyDialogStyle" parent="@android:style/Theme.Dialog">
        <item name="android:windowBackground">@android:color/transparent</item> <!-- //设置dialog的背景,此处为系统给定的透明值 -->
        <item name="android:windowFrame">@null</item>               <!--  //Dialog的windowFrame框为无 -->
        <item name="android:windowNoTitle">true</item>        <!-- // 是否显示标题 -->
        <item name="android:windowIsFloating">true</item>         <!--   //// 是否浮现在activity之上 -->
        <item name="android:windowIsTranslucent">true</item>       <!--  // 是否半透明 -->
        <item name="android:windowContentOverlay">@null</item>  <!--     // 是否有覆盖 -->
        <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>  <!--  设置Activity出现方式 -->
       <!--  <item name="android:backgroundDimEnabled">true</item>  -->    <!--   // 背景是否模糊显示 -->
</style>

请教一下这是什么问题,还有就是怎么尽快把那个页面销毁掉

activity调用finish方法 会依次调用onPause、onStop、onFinish 可以看出finish方法掉是必然会有延迟
个人觉得为了达到你的需求目的,可以设置activity的启动模式为singleTask,
<activity android:name=".aivity" android:launchMode="singleTask

如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的onNewIntent())。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移除栈。如果栈中不存在该实例,将会创建新的实例放入栈中。

既然你的需求是 根据信息状态的不同该Activity显示的内容也不同。
那你只需要根据信息的不同,将显示的内容作调整就可以了,根本不需要再启动一个新的activity,只需要在信息改变时,对视图进行刷新就可以了。
只需要在注册文件中定义你这个Activity的启动模式,定义为 singleTask,那么每次调用startActivity(it),会在返回栈中直接取出这个活动的示例用于显示,根本不需要你再用HashMap去保存和销毁之前启动的活动实例这些麻烦的操作

finish()方法只是触发Activity销毁,又不是在finish()方法里面调用的onDestroy()方法

    } else {
        result.finish();
        result = null;
        AlertActivityList.put(activityname, activity);
    }

你这样写肯会在触发Activity的onDestroy()后清除AlertActivityList列表里的对象,在第一个Activity被释放后第二个Activity没放到列表里去吧