关于activity的管理

一般开发中,有时候会碰到activityA跳转到其他activityB后,为了保证返回时候页面被更改的信息仍然存在,因此跳转时候,该页面无法被finish掉。然而,有时当继续跳转到第三个页面C,我再返回,我又不希望返回到activityA。那么怎么办呢?
有以下三种解决办法可供选择:
一、在清单文件中设置activity的lauchMode属性:

  1. standard:一般默认的;activity实例一个一个往栈里添加;
  2. singleTop:顾名思义,启动该activity的时候,如果栈顶不是该activity实例,则创建新的实例。如果是,则不创建新的实例,而是直接调用onNewIntent();
  3. singleTask:本应用启动该activity:如果栈里存在该activity实例,则清空该实例上面所有activity;如果不存在,创建新的实例;其他应用启动该activity,创建一个新的任务,而该实例会在新的任务栈底部;
  4. singleInstance:启动一个新的任务,来存放该activity实例,但如果再打开新的activity,新的activity实例不会存放在该任务栈中;

    备注:如果启动一个其他应用的启动模式为singleTask的activity,而这个activity正好在后台。那么这个activity所在的任务会被移到前台。所以按返回键,会先清除这个新的activity所在栈里的实例,其次是之前activity所在任务栈的实例;

二、页面C返回使用intent跳转,设置flag属性:
(下面只列举常用几个)
1. FLAG_ACTIVITY_NEW_TASK:系统会寻找或者创建一个新的Task来放置目标activity,如果有目标activity的taskAffinity属性相同的task存在,则将其压入此栈。如果没有,则创建一个新的task,其taskAffinity设置为目标activity的taskActivity;
(Affinity:默认情况下,一个应用内的所有Activity都具有相同的affinity,都是从Application(参考的taskAffinity属性)继承而来,而Application默认的affinity是中的包名,我们可以为设置taskAffinity属性值,这样可以应用到下的所有,也可以单独为某个Activity设置taskAffinity。)
因此,应用内使用单独使用该flag基本上没啥用。但可以配合cleartop使用,如:
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|intent.FLAG_ACTIVITY_NEW_TASK);这样可以做到返回主页之类的功能。原理即为清空栈内所有activity,然后创建新的目标activity);
2. FLAG_ACTIVITY_SINGLE_TOP:实现效果同activity启动模式singleTop;
3. FLAG_ACTIVITY_CLEAR_TOP:如果栈内存在该activity的实例,清空之前该activity实例及其上面所有activity实例;然后创建新的activity实例;如果不存在,则直接创建该应用实例。
4. FLAG_ACTIVITY_CLEAR_TASK :如果在调用Context.startActivity时传递这个标记,将会导致任何用来放置该activity的已经存在的task里面的已经存在的activity先清空,然后该activity再在该task中启动,也就是说,这个新启动的activity变为了这个空tas的根activity.所有老的activity都结束掉。该标志必须和FLAG_ACTIVITY_NEW_TASK一起使用。

三、创建ActivityCollector类:

publick class ActivityCollector{
    public static List<Activity> activities = new ArrayList<>();
    //模拟栈操作,将activity添加到集合中;一般在activity启动时候调用(如oncreate()中)
    public static void addActivity(Activity activity){
        activities.add(activity);
    }
    //将activity从集合中删除,一般在activity销毁时候调用(如ondestroy()中)
    public static void removeActivity(Activity activity){
        activities.remove(activity);
    }
    //finish掉集合中所有activity
    public static void finishAll(){
        for (Activity activity:activities) {
            if(!activity.isFinishing()){
                activity.finish();
            }
        }
    }
}

使用这个类我们可以模拟了一个栈的机制;我们可以在所有activity的基类baseActivity的oncreate()中调用addActivity(),在ondestroy()中调用removeActivity()。这样只需要调用finishAll(),我们就可以随时随地清空所有activity;是不是很开心?

那么问题又来了:如何我只想找到某一个未曾finish掉的activity呢?
我们可以在添加一个方法:

public static Activity getActivity(Class<?> activity){
     for (int i = 0; i < activities.size(); i++) {
            if (activities.get(i).getClass().isAssignableFrom(activity)){
                return activities.get(i);
            }
        }
     return null;
}

这时,我们只需调用该方法即可;如:
MineActivity activity = (MineActivity)ActivityCollector.getActivity(MineActivity.class);

同理我们还可以添加很多方法,比如删除除了指定activity以外的所有activity等等;

备注:使用activityCollector类时要注意,activity调用addActivity()时,注意配套使用removeActivity()方法,避免发生内存泄露;当然,也有使用软引用或者弱引用来创建类似的模拟栈管理类,但大致原理都是如此。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值