关于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启动模式的知识点,是因为文章太多了,讲解细致的比比皆是,下面几个博文各有特色,可以参考(注意文章和评论结合看):
- 我打赌你一定没搞明白的Activity启动模式
- 彻底弄懂Activity四大启动模式
- 最易懂的Activity启动模式详解
- Android中Activity四种启动模式和taskAffinity属性详解
Android开发艺术探索这本书中也有对启动模式的详尽介绍,第一篇应该也是以书中为主体的一篇博文。
每篇博文代表了各位作者的阐述思路,侧重也各有不同,以及试图阐述知识过程中采用的方法。