destroyActivity()Android问题中LocalActivityManager类中的Bug

时间:2011-06-24 04:05:07

标签: android

我有一个Tab活动,并且在Tab中,即时通讯使用活动组。并使用LocalActivityManger, 我试图使用LocalActivityManger类

中提供的以下函数调用来销毁Activty
               manager.destroyActivity(mIdList.get(index), true); 
代码中的

。但后来我发现Android impl中存在一个错误

问题的确切来源是LocalActivityManager.java中的以下代码块:

public Window destroyActivity(String id, boolean finish) {
LocalActivityRecord r = mActivities.get(id);
Window win = null;
if (r != null) {
    win = performDestroy(r, finish);
    if (finish) {
        mActivities.remove(r);
    }
}
return win;

} 变量mActivities是包含活动记录的hashmap,它使用传入startActivity()的id作为键。在此方法中,为密钥传入的对象是LocalActivityRecord而不是id字符串。这导致hashmap找不到条目,​​因此不会删除它。

更多信息请参阅此链接。 http://code.google.com/p/android/issues/detail?id=879More

我找到了解决此问题的方法,并使用以下功能来解决问题。

       public boolean destroy(String id) {

        if(manager != null){
            manager.destroyActivity(id, false);
            try {
                final Field mActivitiesField = LocalActivityManager.class.getDeclaredField("mActivities");
                if(mActivitiesField != null){
                    mActivitiesField.setAccessible(true);
                    @SuppressWarnings("unchecked")
                    final Map<String, Object> mActivities = (Map<String, Object>)mActivitiesField.get(manager);
                    if(mActivities != null){
                        mActivities.remove(id);
                    }
                    final Field mActivityArrayField = LocalActivityManager.class.getDeclaredField("mActivityArray");
                    if(mActivityArrayField != null){
                        mActivityArrayField.setAccessible(true);
                        @SuppressWarnings("unchecked")
                        final ArrayList<Object> mActivityArray = (ArrayList<Object>)mActivityArrayField.get(manager);
                        if(mActivityArray != null){
                            for(Object record : mActivityArray){
                                final Field idField = record.getClass().getDeclaredField("id");
                                if(idField != null){
                                    idField.setAccessible(true);
                                    final String _id = (String)idField.get(record);
                                    if(id.equals(_id)){
                                        mActivityArray.remove(record);
                                        break;
                                    }
                                }
                            }
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return true;
        }
        return false;
    }

现在的问题是,此修复程序在Android API版本2.1,2.2和2.3中运行良好,但我在3.0中测试过。但它失败了。没有例外。

我想知道修复了哪个API版本。

还可以为此做出什么修复,以便在2.1之后的所有API版本中都能正常运行。

谢谢你

0 个答案:

没有答案