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

2017-12-19  本文已影响1人  dlihasa

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

上一篇下一篇

猜你喜欢

热点阅读