我有一个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版本中都能正常运行。
谢谢你