In my android application i am using activity group inside tabs,am maintaining the list of previous screens as well.The issue is,if we press back immediately after the screen gets loaded ,the Backpress method is not called and the app gets exited,whereas if i do the same after a delay say 30 secs in the screen it works as expected.Could not resolve the issue at all.Have debugged the code and have noticed that the new screen is added to the stacklist but the backpress method itself is not called.Tried implementing backpress in the activity and also in tabgroup class but no use.Please let me know where i am going wrong.The code that i use to add a activity is
Intent intent = new Intent(context, TrialActivity.class);
intent.putExtra("feedId", moreitems.get(arg2).getItem_id());
intent.putExtra("heading", moreitems.get(arg2).getItem_name());
TabGroupActivity parentActivity = (TabGroupActivity) ((Activity) context)
.getParent();
parentActivity.startChildActivity(moreitems.get(arg2).getItem_name()
+ Calendar.getInstance().getTimeInMillis(), intent);
MyTabgroup class is
@SuppressWarnings("deprecation")
public class TabGroupActivity extends ActivityGroup {
private ArrayList<String> mIdList;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (mIdList == null)
mIdList = new ArrayList<String>();
}
@Override
protected void onPause()
{
super.onPause();
}
@Override
protected void onResume() {
// to start the first activity every time on reload( on focus of tab).
// remove the search activity if it is in the stack
if (mIdList != null && mIdList.size() > 0) {
int index = -1;
for (int i = 0; i < mIdList.size(); i++) {
String firstId = mIdList.get(i);
if (firstId != null
&& "search".equalsIgnoreCase(firstId.substring(0,
firstId.length() - 1))) {
index = i;
}
}
if (index != -1) {
LocalActivityManager manager = getLocalActivityManager();
manager.destroyActivity(mIdList.get(index), true);
mIdList.remove(index);
index--;
String lastId = mIdList.get(index);
Intent lastIntent = manager.getActivity(lastId).getIntent();
Window newWindow = manager.startActivity(lastId, lastIntent);
setContentView(newWindow.getDecorView());
}
}
super.onResume();
}
/**
* This is called when a child activity of this one calls its finish method.
* This implementation calls {@link LocalActivityManager#destroyActivity} on
* the child activity and starts the previous activity. If the last child
* activity just called finish(),this activity (the parent), calls finish to
* finish the entire group.
*/
@Override
public void finishFromChild(Activity child) {
LocalActivityManager manager = getLocalActivityManager();
int index = mIdList.size() - 1;
if (index < 1) {
Alerts.exit("Confirm",
"Do you really wish to exit from iDream Media?", this);
return;
}
manager.destroyActivity(mIdList.get(index), true);
mIdList.remove(index);
index--;
String lastId = mIdList.get(index);
Intent lastIntent = manager.getActivity(lastId).getIntent();
Window newWindow = manager.startActivity(lastId, lastIntent);
setContentView(newWindow.getDecorView());
}
/**
* Starts an Activity as a child Activity to this.
*
* @param Id
* Unique identifier of the activity to be started.
* @param intent
* The Intent describing the activity to be started.
* @throws android.content.ActivityNotFoundException.
*/
public void startChildActivity(String Id, Intent intent) {
Window window = getLocalActivityManager().startActivity(Id,
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP));
if (window != null) {
mIdList.add(Id);
setContentView(window.getDecorView());
}
}
/**
* The primary purpose is to prevent systems before
* android.os.Build.VERSION_CODES.ECLAIR from calling their default
* KeyEvent.KEYCODE_BACK during onKeyDown.
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
// onBackPressed();
// preventing default implementation previous to
// android.os.Build.VERSION_CODES.ECLAIR
return true;
}
return super.onKeyDown(keyCode, event);
}
/**
* Overrides the default implementation for KeyEvent.KEYCODE_BACK so that
* all systems call onBackPressed().
*/
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
onBackPressed();
return true;
}
return super.onKeyUp(keyCode, event);
}
/**
* If a Child Activity handles KeyEvent.KEYCODE_BACK. Simply override and
* add this method.
*/
@Override
public void onBackPressed() {
int length = mIdList.size();
if (length > 1) {
Activity current = getLocalActivityManager().getActivity(
mIdList.get(length - 1));
current.finishFromChild(current);
}
}
}
Please let me know where i am going wrong.
I finally found out that the issue was beacause of the ads display on top of tab.Referred to the below link and it got resolved.
Back button behavior with tabs and ActivityGroup