今天在用ActivityGroup做例子,发现了个问题,并采用了个笨办法暂时解决。
首先看LocalActivityManager的destroyActivity()的源码:
/** * Destroy the activity associated with a particular id. This activity * will go through the normal lifecycle events and fine onDestroy(), and * then the id removed from the group. * * @param id Unique identifier of the activity to be destroyed * @param finish If true, this activity will be finished, so its id and * all state are removed from the group. * * @return Returns the window that was used to display the activity, or * null if there was none. */ 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; }
大家可能已经发现remove的时候,错误,应该是remove(id)。不知道google的错误,还是故意这么做,不让删除。
这样以来在调用destroyActivity就没法删除,这样在做ActivityGroup的返回就会出错误。
具体ActivityGroup中Activity的返回代码如下:
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP){ onBackPressed(); } return super.onKeyDown(keyCode, event); } public void onBackPressed() { if(index>1){ activityManager.destroyActivity((index)+"", true); boolean isWhile = true; while(isWhile){ Activity activity = activityManager.getActivity((--index)+""); if(activity!=null){ startActivityBack(activity); isWhile = false; break; } } }else{ super.onBackPressed(); } }
一下是在ActivityGroup中start和back调用的方法:
private int index = 0; public void startActivityForGroup(Intent intent) { boolean isWhile = true; while (isWhile) { Window window = activityManager.startActivity( (++index)+"", intent); Log.d(TAG, "==window:"+window); Log.d(TAG, "==CurrentId:"+index); if(window!=null){ isWhile = false; View decorView =window.getDecorView(); contentView.removeAllViews(); contentView.addView(decorView); break; } } } public void startActivityBack(Activity activity){ if(activity.getWindow()==null) return; System.out.println("==view:"+activity.getWindow().getDecorView()); contentView.removeAllViews(); contentView.addView(activity.getWindow().getDecorView()); }
这样,暂时能够保持正常返回。但是存在隐患。希望大家能够交互方法,让我们的代码更加完善。