Activity的存储是基于栈存储的,因此在顺序上无法进行自由的切换,但是可以弹出栈或新开栈来实现新队列.
这里我们需要学习Activity的启动模式-LaunchModel:
LaunchModel总共分为4种模式:
standard(标准模式):每次请求都会创建一个新的Activity实例.
singleTop(栈顶复用模式):如果请求的Activity已经在栈顶不存在则创建,如果已经在栈顶存在,会调用其onNewIntent().
应用场景:通知栏的消息点击会产生详情页面,这个详情界面就可以采用singleTop模式,避免多个通知出现多个Activity,用户不断的back.
singleTask(栈内复用模式):如果请求的Activity已经在栈中存在,则让当前Activity移至栈顶同时弹出它之上的所有Activity,并调用其onNewIntent().
应用场景:1.从个人中心修改资料,通常我们会使用statrtActivityForResult到下一个修改界面然后继续到下一个界面,直到到了最后一个界面修改完成后,依次setResult()+finish(),最终完成资料的修改.这里我们可以使用singleTask给个人中心activity,在最后一个修改的Activity完成后,将值传递给个人中心activity -onNewIntent()接收数据就可以了.
2.返回主页也可以用这个模式实现.
singleInstance(新栈复用模式):和singleTask类似,只不过开启了一个新的Activity栈来存储Activity.
使用场景:1.用户需要注销登陆时2.开启新应用(拍照,图库,浏览器,拨号等)
下面我们先用代码来验证一下:
将Activity4设置为singleTop:
结果Actiivty4的onNewIntent被调用了,并且Activity也没有再次创建:
再来看看当前应用中栈情况(命令:adb shell dumpsys activity):
将Activity2设置为singleTask模式,
我们来看结果:
我们这时查看栈中的情况:
Activity2被复用了,并且弹出之上的栈Activity3,Activity4
最后一种singleInstance,我们将Activity4设置为singleInstance模式,由Activity3来启动Activity4
栈中情况如下:
出现了2个栈(除开桌面),新开了一个栈.如果此时还有Activity4的请求,将会执行它的onNewIntent()。
关于栈的名称设置,在minifest中可以设置:
android:taskAffinity="xx"自行设置.