Столкнулся с той же проблемой, и кажется, что есть ошибка (или была) с LocalActivityManager, которая возникает, когда вы пытаетесь (повторно) запустить действие с тем же идентификатором, что и ранее уничтоженное действие.Он просто вернет null как Window из-за ошибки внутри метода destroyActivity.Обходной путь, который я использую, использует отражение для правильного уничтожения действия (подробное объяснение после обходного пути):
public boolean destroyActivityWorkAround(String id) {
final LocalActivityManager activityManager = getLocalActivityManager();
if(activityManager != null){
activityManager.destroyActivity(id, false);
try {
// Use reflection to get to the HashMaps with the records(which activities are started ect.)
// to remove the records properly
// http://code.google.com/p/android/issues/detail?id=10083
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(activityManager);
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(activityManager);
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) {
Log.e(LOGTAG, this.getClass().getSimpleName() + ".destroyActivityWorkAround() removing activity using reflection failed with error:", e);
//e.printStackTrace();
}
return true;
}
return false;
}
Это обходной путь, потому что LocalActivityManager.destroyActivity (...) содержит ошибку в несколькихAPI-версия.Метод не удаляет Activity должным образом из его HashMap ( LocalActivityManager's source ):
public Window destroyActivity(String id, boolean finish) {
LocalActivityRecord r = mActivities.get(id); //<-- id's are the key's for the HashMap
Window win = null;
if (r != null) {
win = performDestroy(r, finish);
if (finish) {
mActivities.remove(r); //--> This works on id's not the 'r object', this doesn't remove anything
}
}
return win;
}
оператор if (finish) должен быть таким, как следует, чтобы удалить LocalActivityRecord активностиуничтожено:
if (finish) {
mActivities.remove(id); //--> mActivities should remove the id
mActivityArray.remove(r); //--> mActivitiesArray should remove the 'r object' (LocalActivityRecord)
}
Хотя говорят, что это исправлено для Froyo, но я все еще сталкивался с этим на Samsung galaxy S2 под управлением 2.3.3