Activity和Fragment的回退

一.Fragment的回退
1
2
3
4
5
6
7
int  num = getActivity().getSupportFragmentManager().getBackStackEntryCount();
String numString =  "++++++++++++++++++++++++++++++++++Fragment回退栈数量:" +num;
TALogger.d( "Fragment" , numString);
for  ( int  i =  0 ; i < num; i++) {
     BackStackEntry backstatck = getActivity().getSupportFragmentManager().getBackStackEntryAt(i);
     TALogger.d( "Fragment" , backstatck.getName());
}

最后一步是调用:

1
getActivity().getSupportFragmentManager().popBackStackImmediate(CreateGroupNameFragment. class .getName(), FragmentManager.POP_BACK_STACK_INCLUSIVE);

即弹出Tag为CreateGroupNameFragment之上的所有(包括自身)的Fragment。

popBackStackImmediate(name,flag);

第二个参数:只能是 0 或者 1(POP_BACK_STACK_INCLUSIVE);

第一个参数为null时,第二个参数为0时:

会弹出回退栈中最上层的那一个fragment。

因为经测试,回退栈中的fragment个数减少了一个。

第二个参数为1时:

会弹出所有回退栈中的fragment。

因为经测试,回退栈中的fragment个数变为0了。

二.Activity清除栈

   我们知道Android的窗口类提供了历史栈,我们可以通过stack的原理来巧妙的实现,这里我们在A窗口打开B窗口时在Intent中直接加入标 志     Intent.FLAG_ACTIVITY_CLEAR_TOP,这样开启B时将会清除该进程空间的所有Activity。

在A窗口中使用下面的代码调用B窗口

     
     
  1. Intent intent = new Intent(); 
  2. intent.setClass(Android123.this, CWJ.class); 
  3. intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  //注意本行的FLAG设置 
  4. startActivity(intent);

接下来在B窗口中需要退出时直接使用finish方法即可全部退出。


A - B - C

当 B - A - B 跳转的时候,使用Intent的FLAG_ACTIVITY_CLEAR_TOP会让第一个B和第二个A,destory掉

但是当B - A - C跳转的时候不会调用B和A的destory

其实这个问题以前遇到过,今天遇到的时候又忘记了。查看API文档才发现原因,所以这里记录一下避免下次又忘记了

文档上说,如果设置这个属性,是当要启动的Activity已经存在当前Task中,才会在启动的时候销毁其他的Activity。

所以上面当A跳C的时候不满足此条件。


当然如果你想实现这个效果可以使用:

it.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK);(注:API11)


        关掉自己

在activity加入代码:
[java] view plaincopy
  1. Override  
  2. protected void onNewIntent(Intent intent) {  
  3. // TODO Auto-generated method stub  
  4. super.onNewIntent(intent);  
  5. //退出  
  6.  if ((Intent.FLAG_ACTIVITY_CLEAR_TOP & intent.getFlags()) != 0) {  
  7.  finish();  
  8.  }  
  9. }

原理总结:
一般A是程序的入口点,从D起一个A的activity,加入标识Intent.FLAG_ACTIVITY_CLEAR_TOP这个过程中会把栈中B,C,都清理掉。因为A是android:launchMode="singleTop"
不会调用oncreate(),而是响应onNewIntent()这时候判断Intent.FLAG_ACTIVITY_CLEAR_TOP,然后把A finish()掉。
栈中A,B,C,D全部被清理。所以整个程序退出了。

三.自定义activity栈管理
在应用程序的每个Activity里面的onCreate()或者onStart()里面把当前的的Activity加入该栈中(addActivity),在你需要退出activity的时候,调用下面对应的方法去销毁栈。
	不过这样有一个问题,如果你的应用程序有很多个Activity,那么加栈的这个代码就要重复写很多次,为了偷懒,可以选择写一个Activity的子类(比如BaseActivity),之后的该应用程序里的所有Activity都继承你写的
BaseActivity,在BaseActivity里面的onCreate()或者onStart()里面把当前的的Activity加入该栈中(addActivity),这样会省去很多代码的。(AppManager.getInstance().addActivity(this);)
private LinkedList<Activity> activityList = new LinkedList<>();


public void addActivity(Activity activity) {
    activityList.add(activity);
}

public void removeActivity(Activity activity) {
    mActivities.remove(activity);
}

public void finishAll() {
    for (Activity act : activityList) {
        act.finish();
    }
}
/**
 * 获取当前处于栈顶的activity,无论其是否处于前台
 */
public static Activity getCurrentActivity() {
    List<Activity> copy;
    synchronized (mActivities) {
        copy = new ArrayList<Activity>(mActivities);
    }
    if (copy.size() > 0) {
        return copy.get(copy.size() - 1);
    }
    return null;
}
public synchronized static AppContext getInstance() {
    return mApplication;
}
在baseactivity中实例化
AppContext.getInstance().mActivities.add(this);

      
      
        
        
  1. import android.app.Activity;
  2. import android.app.ActivityManager;
  3. import android.content.Context;
  4. import java.util.Stack;
  5. /**
  6. * app管理类 对应用的activity进行控制
  7. *
  8. * @author Huangnan
  9. */
  10. public class AppManager {
  11. private static AppManager manager;
  12. private Stack<Activity> activityStack;
  13. private AppManager() {
  14. }
  15. //单例
  16. public static AppManager getInstance() {
  17. if (manager == null) {
  18. synchronized (AppManager.class) {
  19. if (manager == null) {
  20. manager = new AppManager();
  21. }
  22. }
  23. }
  24. return manager;
  25. }
  26. /**
  27. * 添加Activity到堆栈
  28. */
  29. // Stack <Activity> activityStack;
  30. public void addActivity(Activity activity) {
  31. if (activityStack == null) {
  32. activityStack = new Stack<Activity>();
  33. }
  34. activityStack.add(activity);
  35. }
  36. /**
  37. * 获取当前Activity(堆栈中最后一个压入的)
  38. */
  39. public Activity currentActivity() {
  40. Activity activity = activityStack.lastElement();
  41. return activity;
  42. }
  43. /**
  44. * 结束当前Activity(堆栈中最后一个压入的)
  45. */
  46. public void finishActivity() {
  47. Activity activity = activityStack.lastElement();
  48. finishActivity(activity);
  49. }
  50. /**
  51. * 结束指定的Activity
  52. */
  53. public void finishActivity(Activity activity) {
  54. if (activity != null) {
  55. activityStack.remove(activity);
  56. activity.finish();
  57. activity = null;
  58. }
  59. }
  60. /**
  61. * 结束指定类名的Activity
  62. */
  63. public void finishActivity(Class<?> cls) {
  64. for (Activity activity : activityStack) {
  65. if (activity.getClass().equals(cls)) {
  66. finishActivity(activity);
  67. }
  68. }
  69. }
  70. /**
  71. * 结束所有Activity
  72. */
  73. public void finishAllActivity() {
  74. for (int i = 0; i < activityStack.size(); i++) {
  75. if (null != activityStack.get(i)) {
  76. activityStack.get(i).finish();
  77. }
  78. }
  79. activityStack.clear();
  80. }
  81. /**
  82. * 退出应用程序
  83. */
  84. public void AppExit(Context context) {
  85. try {
  86. finishAllActivity();
  87. ActivityManager activityMgr = (ActivityManager) context
  88. .getSystemService(Context.ACTIVITY_SERVICE);
  89. activityMgr.killBackgroundProcesses(context.getPackageName());
  90. System.exit(0);
  91. } catch (Exception e) {
  92. }
  93. }
  94. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值