startActivity&startActivities有什么不同?

问题

平时用startActivity用习惯了,当别人问你startActivities是什么意思时,你会不假思索的说,可能是同时启动多个activity吧,这简直就是一道送命题啊,验证之后才发现不是想象中那么简单。

准备三个ActivityA,ActivityB,ActivityC:
startActivity&startActivities有什么不同?_第1张图片 startActivity&startActivities有什么不同?_第2张图片 startActivity&startActivities有什么不同?_第3张图片
准备代码:

    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写得很好,我也学习了不少好东西),因为我们项目中也出现了这个问题,流程图大概是这样的:
startActivity&startActivities有什么不同?_第4张图片

每家的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))

这还不是重点,重点是发现了我发现了我们的产品推送时,也可以使用这样的逻辑:
startActivity&startActivities有什么不同?_第5张图片
如果你登录成功了,那么我直接可以让你看推送详情页面,否则直接让你登录,伪代码可以如下:

// 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()
}

好了,也算自己的一个总结吧,下次遇到这种问题时,就知道该怎么写了。

你可能感兴趣的:(android基础)