今天在用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());
}
这样,暂时能够保持正常返回。但是存在隐患。希望大家能够交互方法,让我们的代码更加完善。