这个是问题的描述:
When I start an activity with LocalActivityManager inside of an ActivityGroup, then destroy it, and then start another activity with the same id, the activity cannot be started again.
Example code (inside of an ActivityGroup):
Class clazz = Class.forName("com.example.MyActivity");
Intent intent = new Intent(this, clazz);
getLocalActivityManager().startActivity("myId", intent);
and later:
getLocalActivityManager().destroyActivity("myId", true);
and then:
Window window = getLocalActivityManager().startActivity("myId", intent);
Problem:
The second call to startActivity returns null.
The problem seems to be related to the following code in LocalActivityManager.java:
377 public Window destroyActivity(String id, boolean finish) {
378 LocalActivityRecord r = mActivities.get(id);
379 Window win = null;
380 if (r != null) {
381 win = performDestroy(r, finish);
382 if (finish) {
383 mActivities.remove(r);
384 }
385 }
386 return win;
387 }
On line 383, I think it should be remove(id) instead of remove(r)
这个是问题的的解决方案:
public boolean destroy(String id) { final LocalActivityManager activityManager = <your activity manager> if(activityManager != null){ activityManager.destroyActivity(id, false); // http://code.google.com/p/android/issues/detail?id=12359 // http://www.netmite.com/android/mydroid/frameworks/base/core/java/android/app/LocalActivityManager.java 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(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) { e.printStackTrace(); } return true; } return false; }