平时用startActivity用习惯了,当别人问你startActivities是什么意思时,你会不假思索的说,可能是同时启动多个activity吧,这简直就是一道送命题啊,验证之后才发现不是想象中那么简单。
准备三个ActivityA,ActivityB,ActivityC:
准备代码:
fun multiIntent(view : View) {
val intent_1 = Intent(this,IntentActivityA::class.java)
val intent_2 = Intent(this,IntentActivityB::class.java)
val intent_3 = Intent(this,IntentActivityC::class.java)
startActivities(arrayOf(intent_1,intent_2,intent_3))
}
结果展示为:
可以看到,先展示是ActivityC,然后是ActivityB,最后是ActivityA,那么情况是不是这样的:我startActivities时,ActivityA、ActivityB和ActivityC都被创建了,只是依次压入栈底了,我finish掉ActivityC,清除了栈顶,然后ActivityB就可见了,清除ActivityB之后,ActivityA就到栈顶了。
还是另外一种情况:先创建了ActivityC,等到ActivityC finish掉之后,再开始创建ActivityB,等到ActivityB finish掉之后,再创建ActivityA呢?我们先打一波log看看:
IntentActivity C onCreate
IntentActivity B onCreate
IntentActivity C onDestroy
IntentActivity A onCreate
IntentActivity B onDestroy
IntentActivity A onDestroy
通过log我们发现,startActivities的逻辑是我们的方式二,是单个Activity创建的,创建完成之后,等到Activity finish之后再创建剩余的Activity;并不是我们想象的一口气创建统统压入栈中的。
说了这么多,你会不会感觉这个玩意没什么卵用,因为这样的需求我遇见的不多。的确,这个方法我以前是不知道的,也从来没用过,但是最近遇到了这样的问题,先截取一下开源中国说明一下:
这个程序的主要问题在哪里呢?他点击了广告详情进入目标页面之后,然后点击返回,并没有像我们想象的一样直接返回主界面,而是整个程序都退出了,然后再延迟进入主界面的,这样的操作给人感觉不是很好的(我不否认开源中国这个app写得很好,我也学习了不少好东西
),因为我们项目中也出现了这个问题,流程图大概是这样的:
每家的app逻辑都不太一样,我们这样是首页出现广告页面(与开源中国OSC中一样的显示),然后你点击进去可以买东西,买了直接进入主界面MainActivity。当初我们的做法比较辣鸡,伪代码如下:
# ProductDetailActivity 中
# 返回按钮和后退按钮共用同一个方法
public void onBackPress() {
if(isFromSplashPage) { //如果是从来Splash页面来的,那么这里就需要返回到主界面
MainActivity.start(this);
finish();
}else { //其他页面可以进入产品详情页面,此时直接退出页面即可
finish();
}
这样的做法不是不可以,但是意识到startActiitives的作用之后,那就不用传入isFromSplashPage参数了,直接这样就可以:
# SplashActivity 页面
var intent_main = Intent(this, MainActivity::class.java)
var intent_product = Intent(this, ProductDetailActivity::class.java)
startActivities(arrayOf(intent_main, intent_product))
这还不是重点,重点是发现了我发现了我们的产品推送时,也可以使用这样的逻辑:
如果你登录成功了,那么我直接可以让你看推送详情页面,否则直接让你登录,伪代码可以如下:
// PushUtils:
if(userHasLogin) {
var intent_detail = Intent(this, PushDetailActivity::class.java)
var intent_main = Intent(this,MainActivity::class.java)
startActivitied(arrayOf(intent_detail, intent_main))
}else {
startActivity(Intent(this,LoginActivity::class.java))
}
//LoginActivity
if(LoginSuccess) {
var intent_detail = Intent(this, PushDetailActivity::class.java)
var intent_main = Intent(this,MainActivity::class.java)
startActivitied(arrayOf(intent_detail, intent_main))
}else{
var intent_main = Intent(this,MainActivity::class.java)
startActivity(intent_main)
finish()
}
好了,也算自己的一个总结吧,下次遇到这种问题时,就知道该怎么写了。