美文网首页
关于Activity的启动模式的应用以及其他类似的处理方式

关于Activity的启动模式的应用以及其他类似的处理方式

作者: dlihasa | 来源:发表于2017-12-19 15:23 被阅读1次

    Activity的启动模式

    在android开发过程中,有些需求的实现用activity的启动模式的知识来完成会很简单。

    比如:

    • 简单的例子:

    防止多次点击,出现多个重复的activity页面,这时候就可以简单的采用singleTop配置来防止处于栈顶的页面被重复打开。

    • 稍微麻烦点儿:

    我在完成几个页面的信息选择之后,需要将这几个页面的数据回显到最初的页面,并且关闭中间这几个选择页面:A(目标页)->B(选择页面1)->C(选择页面2)->...(n个页面)后返回A页面并根据这些选择的信息来做处理(回显等),这时候activity的启动模式就起到作用了。

    // 方法一 :Manifest文件中不设置,代码中设置Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP(缺一不可)
    (Intent.FLAG_ACTIVITY_SINGLE_TOP可以在Manifest中用singleTop设置替代)
     Intent intent = new Intent(this,A.class);
     intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);
     intent.putExtra("title",title);//带给A的信息
     intent.putExtra("school",school);//带给A的信息
     startActivity(intent);
    
    //方法二:在Manifest文件中设置singleTask的启动模式
     Intent intent = new Intent(this,A.class);
     intent.putExtra("title",title);//带给A的信息
     intent.putExtra("school",school);//带给A的信息
     startActivity(intent);
    
    

    以这种方式重新启动目标activity,会调用activity的onNewIntent方法,方法一如果丢失了singleTop的配置,虽然可以重新打开目标activity,但是不会调用onNewIntent的方法。

    其他类似的处理方式

    首先这个类最初是在郭婶做权限处理的视频中看到的

    public class ActivityCollector {
    
        private static List<Activity> activityList = new ArrayList<>();
    
        /**
         * 将当前启动的activity加入list
         */
        public static void addActivity(Activity activity){
            activityList.add(activity);
        }
    
        /**
         * 将销毁的activity移出list
         */
        public static void removeActivity(Activity activity){
            activityList.remove(activity);
        }
    
        /**
         * 获取栈顶activity
         */
        public static Activity getTopActivity(){
            if(!activityList.isEmpty()){
                return activityList.get(activityList.size()-1);
            }else{
                return null;
            }
        }
    
        /**
         * 关闭size个activity
         */
        public static void finish(int size){
            for(int i=0;i<size;i++){
                if(getTopActivity()!=null){
                    getTopActivity().finish();
                    removeActivity(getTopActivity());
                }
            }
        }
    }
    

    在项目的activity基类中使用ActivityCollector 来构造启动activity的集合

    public class ABaseActivity extends AppCompatActivity{
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            ActivityCollector.addActivity(this);
        }
    
        /**
         * onDestroy
         * 要去回收资源
         * 做好处理
         */
        @Override
        protected void onDestroy() {
            super.onDestroy();
            ActivityCollector.removeActivity(this);
        }
    }
    
    

    这样一来你就可以随意的关闭任意个activity,如果有必要,你仍然可以在ActivityCollector中添加自己需要的方法。

    【END】之所以没有在这篇中介绍activity启动模式的知识点,是因为文章太多了,讲解细致的比比皆是,下面几个博文各有特色,可以参考(注意文章和评论结合看):

    Android开发艺术探索这本书中也有对启动模式的详尽介绍,第一篇应该也是以书中为主体的一篇博文。
    每篇博文代表了各位作者的阐述思路,侧重也各有不同,以及试图阐述知识过程中采用的方法。

    相关文章

      网友评论

          本文标题:关于Activity的启动模式的应用以及其他类似的处理方式

          本文链接:https://www.haomeiwen.com/subject/gabbwxtx.html