问题

平时用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 onCreateIntentActivity B onCreateIntentActivity C onDestroyIntentActivity A onCreateIntentActivity B onDestroyIntentActivity 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()
}

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

最新文章

  1. sqlalchemy 对 mysql 进行增删改查
  2. java底层原理书籍_不愧是阿里p8大佬!终于把Java 虚拟机底层原理讲清楚了,请签收...
  3. Pytorch教程(十三):reshape、squeeze、flatten
  4. 面对面交流的好处_我们的交流方式是如何被网络社交媒体一步步改变的
  5. php感悟1500,《与美同行》读后感1500字
  6. Git合并特定commits 到另一个分支
  7. 算法:分离链表为两部分,小于某个值都在左边,大于等于某个值在右边 Partition List
  8. chrome中如何下载文本文件(不是直接打开)
  9. 工厂中用计算机,计算机技术在工厂监控系统中的应用
  10. PPC手机新手教程,使用方法,疑难解答,最强大的PPC手机使用手则
  11. PcShare2007 暗桩
  12. AI产品经理的前世今生
  13. 人类捕杀动物,吃动物就残忍了吗?
  14. 机器学习、深度学习、数据挖掘各种资源整理
  15. 2017外汇公司国际品牌排行榜
  16. 什么是adsl动态拨号服务器?
  17. 文华财经指标公式博易大师软件指标公式
  18. python之__len__()
  19. 【oh-my-zsh】打造强大又美观的linux终端
  20. 烤仔观察 | 风口上的“大哥”——黄立成

热门文章

  1. 除了框架,前端面试还问什么
  2. 有氧运动存在哪些误区
  3. python书籍推荐django_关于Django,我想推荐这样一本书给你
  4. 解决chm文件打开后跳到某一主页方法
  5. 以太网未识别的网络win10_Win10以太网未识别的网络怎么办
  6. 【全面恢复受损的Word文档】
  7. mysql执行计划explain介绍_MySQL中的执行计划explain详解
  8. 电子计算机和过去的计算工具相比,电子计算机与过去的计算工具相比,所具有的特点有()....
  9. 一份无锡工程师的分享
  10. 中软国际软件测试培训中心,中软国际准员工培养计划C++开发/软件测试方向开班典礼...